PHP 抽象类和受保护的方法



像标题说我对这段代码有问题:

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();

它正在投掷:

致命错误:从第 38 行的 C:\xampp\htdocs\Learning\index.php 中的上下文"AA"调用受保护的 A1::a1()

第 38 行是这样的:

$a11 = new A1();

我不明白如果我不在那行调用 a1(),为什么它会抛出该错误。

感谢和问候

哈维尔

在第 38 行,你创建了一个类 A1 的实例,所以构造函数被调用:它是第 15 行的function a1()。由于类名不区分大小写,因此构造函数名称也是如此。

由于构造函数受到保护,因此不能从类外部调用它。也许你可以创建一个公共静态函数,在不实例化的情况下调用它,在它里面你可以调用构造函数。它可能适用于单例类设计模式。

如果您只想使用普通方法测试抽象,只需重命名您的函数,这样它们就不会成为构造函数。

最新更新