Свойство private
недоступно в дочерних классах.
class DonaldDuck extends Duck {
public function __construct(){
$this->flyBehavoir = new FlyWithWings;
}
}
Для всех намерений и целей этот класс формально вообще не объявляет flyBehaviour
, поэтому $this->flyBehaviour
в конструкторе создаетновая public
недвижимость.Вы можете ясно видеть это при var_dump
использовании объекта:
object(DonaldDuck)#1 (2) {
["flyBehavoir":"Duck":private]=>
NULL
["flyBehavoir"]=>
object(FlyWithWings)#2 (0) {
}
}
Свойство private
родителя является а) отдельным, б) private
к нему и в) null
, поскольку никто не установилэто еще.В противном случае вы также не сможете получить доступ к $donaldDuck->flyBehavoir->fly()
из-за отсутствия класса!
Если у вас есть свойство private
, вам нужно разрешить действовать только коду того же класса:
class DonaldDuck extends Duck {
public function __construct(){
$this->setFlyBehaviour(new FlyWithWings);
}
}
$donaldDuck = new DonaldDuck();
$donaldDuck->setFlyBehavoir(new FlyWithRocket);
$donaldDuck->preformFly();
Это работает, как вы ожидаете, так как вы используете правильно привилегированные методы для доступа к свойству.Если вы хотите получить доступ к свойству непосредственно в дочерних классах, оно должно быть protected
(что не позволит вам получить к нему доступ из-за пределов класса, однако для этого оно должно быть public
).