我有以下课程
Key = 10, Value = 1
Key = 20, Value = 2
Key = 30, Value = 3
类型的flyBehavoir
FlyBehavoir
preformFly()
flyBehavoir
setFlyBrhavoir(FlyBehavoir $flyBehavoir)
方法,在此构造函数中,我实例化了新的飞行行为__construct
。问题是当我需要在运行时通过FlyWithWings
方法更改flyBehavoir
并将其设置为setFlyBrhavoir()
时,只要FlyWithRocket
是私有的,它就不会更改我把它公开了我该怎么办?
认为只要我访问setter的私有属性,就可以从子类更改父类中的任何属性。
在我的尝试下
flyBehavoir
答案 0 :(得分:3)
在子类中无法访问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
属性是a)单独的,b)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
)