Это работает в PHP:
class A {
public function foo() {
echo $this->bar;
}
}
class B extends A {
public $bar = 1;
}
$b = new B;
$b->foo(); // 1
Это работает из-за динамического разрешения области, которое имеет PHP (то есть: область действия разрешается во время выполнения, а не во время компиляции). Тем не менее, я бы рекомендовал против этого, потому что это действительно особенность языка для одного. Во-вторых, отказ объявить $bar
в подклассе приведет к ошибке. Я думаю, что класс должен ссылаться только на тех членов, о которых ему известно.
Тот же код, скажем, на C ++:
class A {
public:
void foo() {
std::cout << bar;
}
};
class B : public A {
public:
int bar;
B() {
bar = 1;
}
};
... выдаст ошибку компиляции ( В A :: foo (): 'bar' не был объявлен в этой области ).