2010-11-19 1 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

+0

Есть ли способ сделать это, не делая его статическим? – fire

+0

@fire: Нет, если вы хотите, чтобы два разных экземпляра имели значение. Вы * можете * сделать это через третий объект, на который ссылаются оба экземпляра, но удобна ли это или нет, зависит от фактического контекста. –

2

Foo run создает объект Bar, который имеет toy, инициализированный car. Итак, результат car, как и ожидалось.

0

Что вы делаете это «делегация»: Вы можете создать новый экземпляр и называем это вместо метода родителей. То, что вы ищете, это

parent::run(); 

Это вызовет метод родителей.

Смежные вопросы