这是我的基本示例:
class Foo {
public $toy = "car";
public function run() {
$this->toy = "train";
$bar = new Bar();
$bar->run();
}
}
class Bar extends Foo {
public function run() {
echo $this->toy;
}
}
$foo = new Foo();
$foo->run();
出于某种原因,它总是呼应汽车而不是火车。这是什么原因?
答案 0 :(得分:2)
Foo
运行会创建一个对象Bar
,其toy
已初始化为car
。因此,结果是car
,正如所料。
答案 1 :(得分:1)
因为您要在Bar
内创建新 Foo::run
实例。您对Foo
实例所做的更改不会对Bar
实例产生任何影响。它们是两个不同的实例
您也可以这样看:每当您从子类实例化一个对象时,都会创建一个新的父类实例。
您可以创建属性static
,然后它将在所有实例之间共享:
class Foo {
public static $toy = "car";
public function run() {
self::$toy = "train";
$bar = new Bar();
$bar->run();
}
}
class Bar extends Foo {
public function run() {
echo self::$toy;
}
}
答案 2 :(得分:0)
你所做的是“委托”:你创建一个新实例并调用它而不是parent方法。您正在寻找的是
parent::run();
这将调用parent方法。