Рассмотрим этот пример в PHP 5.3:
<?php
error_reporting(E_ALL | E_STRICT);
class A
{
private $a = 'A';
protected $b= 'B';
public $c = 'C';
}
class B extends A
{
public function __construct()
{
var_dump($this->a, $this->b, $this->c);
C::test();
var_dump($this->a, $this->b, $this->c);
}
}
class C extends A
{
public function test()
{
$this->a = null;
$this->b = null;
$this->c = null;
}
}
new B();
?>
Вывод:
PHP Notice: Undefined property: B::$a in ... on line 15
NULL
string(1) "B"
string(1) "C"
PHP Strict Standards: Non-static method C::test() should not be called statically, assuming $this from incompatible context in ... on line 16
NULL
NULL
NULL
В результате получается, что указатель C::test()
$this
считается $this
из экземпляра new B()
. Таким образом, он действует как функция-член B, но с доступом к C.
Доступ к защищенным и общедоступным переменным возможен только из A
, а к общедоступным переменным - B
.
Обратите внимание, что перед вызовом C::test()
, $this->a
вызвало уведомление. После вызова он больше не выполнялся, поскольку переменная была создана в ходе вызова. Но ни в коем случае закрытые переменные A
не были доступны.
Так что да, это, строго говоря, считается недействительным в PHP 5.3. И даже если более ранние версии позволяют вам делать это без предупреждения (я не проверял и не исследовал это), вы никогда не должны полагаться на такое поведение, поскольку это, очевидно, злоупотребление ООП.