设置子类的超级类中的私有财产

时间:2018-08-24 12:11:09

标签: php oop

我有以下课程

  • 抽象类鸭子
    此类具有Key = 10, Value = 1 Key = 20, Value = 2 Key = 30, Value = 3 类型的flyBehavoir
    执行飞行功能FlyBehavoir
    设置preformFly() flyBehavoir
  • 的功能
  • DonaldDuck类扩展了Duck
    在此类中,我有一个setFlyBrhavoir(FlyBehavoir $flyBehavoir)方法,在此构造函数中,我实例化了新的飞行行为__construct

问题是当我需要在运行时通过FlyWithWings方法更改flyBehavoir并将其设置为setFlyBrhavoir()时,只要FlyWithRocket是私有的,它就不会更改我把它公开了我该怎么办?

认为只要我访问setter的私有属性,就可以从子类更改父类中的任何属性。

在我的尝试下

flyBehavoir

1 个答案:

答案 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