gpt4 book ai didi

PHP 继承和 protected 成员可见性

转载 作者:行者123 更新时间:2023-12-03 00:13:12 24 4
gpt4 key购买 nike

我发现 PHP 中存在一个奇怪的继承问题。

From the PHP manual :

Members declared protected can be accessed only within the class itself and by inherited and parent classes.

对我来说这意味着:如果 A instanceof BB instanceof A,A 可以访问 B 的 protected 成员。

但是,如果 A 和 B 都扩展了 Foo,并且 Foo 有一个 protected 构造函数,该构造函数不会在 B 中被覆盖,那么我可以从 A 中创建 B 的实例。这对我来说没有意义,因为 A 不是B 的实例,并且 B 不是 A 的实例。我还可以从 A 中调用 protected 方法 $b->test(),该方法执行 B 中实现的方法。(如果 B 执行了不重新声明 test() 然后执行 Foo 中的实现。)对我来说这更奇怪,因为如果 B 直接实现 protected 构造函数,我无法从 A 中创建 B 的实例。奇怪的是,我无法访问 protected 构造函数(也在父类中声明),但访问 protected 方法(也在父类中声明)没有问题。

请注意,当我使用不扩展 Foo 的类 C 时,我确实得到了预期的行为。如果我尝试从 C 中实例化 B,则会收到 fatal error ,因为我正在尝试访问 protected 构造函数。如果我向 B 添加一个公共(public)构造函数,则可以实例化它(这是预期的),但我仍然无法访问 protected 方法 test() (这也是预期的行为)。我期望使用 A 而不是 C 时会出现相同的行为。

再次解释的示例代码:

class Foo {
protected function __construct() {
echo('Constructing ' . get_called_class());
}

protected function test() {
echo('Hello world ' . __METHOD__);
}
}

class A extends Foo {
public function __construct() {
parent::__construct();
}

public function testB() {
// Both of these lines work
$b = new B();
$b->test();
}
}

class B extends Foo {
protected function test() {
echo('Hello world Again ' . __METHOD__);
}
}

class C {
public function __construct() {
}

public function testB() {
// Both of these lines cause fatal errors
$b = new B();
$b->test();
}
}

$a = new A();
$a->testB();

$c = new C();
$c->testB();

我可能没有看到什么,但我找不到什么。谁能给我解释一下这种行为吗?

最佳答案

您可以访问这些方法,因为它们在 Foo 中声明为 protected ,它是您的父级,并且授予您访问它的权限。如果您从父级中删除声明并在 B 中声明 protected 方法,您将收到 fatal error 。

这被报告为 PHP 中的错误 https://bugs.php.net/bug.php?id=50892

关于PHP 继承和 protected 成员可见性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745394/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com