php受保护的成员方法,PHP继承和受保护的成员可见性
我發(fā)現(xiàn)在
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有一個受保護的構(gòu)造函數(shù),在B中沒有被覆蓋,那么我可以在A內(nèi)創(chuàng)建一個B的實例.這對我來說沒有意義,因為A不是B和B不是A的實例.我也可以調(diào)用A中的保護方法$b-> test(),它執(zhí)行在B中實現(xiàn)的方法(如果B不重新測試test(),那么執(zhí)行Foo被執(zhí)行.)對我來說這更奇怪,因為如果B直接實現(xiàn)受保護的構(gòu)造函數(shù),我不能從A內(nèi)創(chuàng)建一個B的實例.看起來很奇怪,我無法訪問受保護的構(gòu)造函數(shù)(也在父類中聲明),但訪問受保護的方法(也在父類中聲明)是沒有問題的.
注意,當我使用不擴展Foo的類C時,我會得到預期的行為.如果我嘗試從C中實例化B,我會遇到一個致命的錯誤,因為我正在嘗試訪問受保護的構(gòu)造函數(shù).如果我向B添加一個公共構(gòu)造函數(shù),可以實例化(這是預期的),我仍然無法訪問受保護的方法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();
我可能沒看到什么,但我找不到什么.有人可以向我解釋這個行為嗎?
總結(jié)
以上是生活随笔為你收集整理的php受保护的成员方法,PHP继承和受保护的成员可见性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 慢性牙周病的治疗原则是什么?
- 下一篇: php树形折叠三级菜单模板,三级树形竖向