2010-11-19 98 views
0

這是我的基本的例子:父類變量

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(); 

出於某種原因,它會永遠回聲車不訓練。這是什麼原因?

回答

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; 
    } 
} 
+0

我在這裏添加了一個更好,更多的邏輯完美... – Kennethvr 2010-11-19 10:07:19

+0

有沒有辦法做到這一點,而不是靜態? – fire 2010-11-19 11:20:01

+0

@fire:如果您想讓兩個不同的實例共享一個值,則不是。你可以通過第三個被兩個實例引用的對象來實現,但是否方便取決於實際的上下文。 – 2010-11-19 12:20:39

2

Foo運行創建一個對象Bar,其中有toy,初始化爲car。如預期的那樣,結果是car

0

你做的是「委派」:您創建一個新的實例,而是調用父母的方法這一點。你正在尋找的是

parent::run(); 

這將調用父母的方法。