php受保护的成员方法,PHP继承和受保护的成员可见性

我发现在

PHP中似乎是一个奇怪的继承问题.

Members declared protected can be accessed only within the class

itself and by inherited and parent classes.

对我而言意味着:

A可以访问B的受保护成员,如果A或B的实例A

但是,如果A和B都扩展了Foo,而Foo有一个受保护的构造函数,在B中没有被覆盖,那么我可以在A内创建一个B的实例.这对我来说没有意义,因为A不是B和B不是A的实例.我也可以调用A中的保护方法$b-> test(),它执行在B中实现的方法(如果B不重新测试test(),那么执行Foo被执行.)对我来说这更奇怪,因为如果B直接实现受保护的构造函数,我不能从A内创建一个B的实例.看起来很奇怪,我无法访问受保护的构造函数(也在父类中声明),但访问受保护的方法(也在父类中声明)是没有问题的.

注意,当我使用不扩展Foo的类C时,我会得到预期的行为.如果我尝试从C中实例化B,我会遇到一个致命的错误,因为我正在尝试访问受保护的构造函数.如果我向B添加一个公共构造函数,可以实例化(这是预期的),我仍然无法访问受保护的方法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();

我可能没看到什么,但我找不到什么.有人可以向我解释这个行为吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值