PHP 抽象 类 和受保护的方法
PHP abstract classes and protected methods
如标题所说,我对这段代码有疑问:
abstract class AClass {
abstract protected function a1();
abstract protected function a2();
public function show() {
return $this->a1() . "<br>" . $this->a2();
}
}
class A1 extends AClass {
protected function a1() {
return 'A1a1';
}
protected function a2() {
return 'A1a2';
}
}
class A2 extends AClass {
protected function a1() {
return 'A2a1';
}
protected function a2() {
return 'A2a2';
}
}
class AA {
public function __construct() {
$a11 = new A1();
$a22 = new A2();
$this->inter($a11);
$this->inter($a22);
}
private function inter(AClass $class) {
echo $class->show();
}
}
$aa = new AA();
正在投掷:
Fatal error: Call to protected A1::a1() from context 'AA' in C:\xampp\htdocs\Learning\index.php on line 38
第 38 行是这样的:
$a11 = new A1();
我不明白为什么我没有在该行调用 a1() 时会抛出该错误。
感谢和问候
哈维尔
在第 38 行,你创建了一个 class A1 的实例,因此构造函数被调用:它是第 15 行的 function a1()
。因为 class 名称是 case-insensitive,构造函数名称也是如此。
由于您的构造函数受到保护,因此无法从 class 外部调用它。也许你可以创建一个 public 静态函数,在没有实例化的情况下调用它,你可以在其中调用构造函数。它对 Singleton class 设计模式有好处。
如果您只想用普通方法测试抽象,只需重命名您的函数,这样它们就不会成为构造函数。
如标题所说,我对这段代码有疑问:
abstract class AClass {
abstract protected function a1();
abstract protected function a2();
public function show() {
return $this->a1() . "<br>" . $this->a2();
}
}
class A1 extends AClass {
protected function a1() {
return 'A1a1';
}
protected function a2() {
return 'A1a2';
}
}
class A2 extends AClass {
protected function a1() {
return 'A2a1';
}
protected function a2() {
return 'A2a2';
}
}
class AA {
public function __construct() {
$a11 = new A1();
$a22 = new A2();
$this->inter($a11);
$this->inter($a22);
}
private function inter(AClass $class) {
echo $class->show();
}
}
$aa = new AA();
正在投掷:
Fatal error: Call to protected A1::a1() from context 'AA' in C:\xampp\htdocs\Learning\index.php on line 38
第 38 行是这样的:
$a11 = new A1();
我不明白为什么我没有在该行调用 a1() 时会抛出该错误。
感谢和问候
哈维尔
在第 38 行,你创建了一个 class A1 的实例,因此构造函数被调用:它是第 15 行的 function a1()
。因为 class 名称是 case-insensitive,构造函数名称也是如此。
由于您的构造函数受到保护,因此无法从 class 外部调用它。也许你可以创建一个 public 静态函数,在没有实例化的情况下调用它,你可以在其中调用构造函数。它对 Singleton class 设计模式有好处。
如果您只想用普通方法测试抽象,只需重命名您的函数,这样它们就不会成为构造函数。