2013-02-28 6 views
2

Я пытаюсь написать следующий код в PHPЗапросы разъяснений о порядке ООП в PHP

class A { 
protected static $comment = "I am A" ; 
public static function getComment() { 
    return self :: $comment; 
} 
} 

class B extends A { 
protected static $comment = "I am B" ; 
} 

echo B::getComment() ; // echoes "I am A" 

Не должна ли она вернуть I am B? В oop PHP не ребенок перезаписывает родителя? Благодарим вас за разъяснения.

== EDIT ==

Кроме того, мой вопрос в том, в чем разница между статическим, то и, например, потому что в случае его работы:

class A { 
    protected $comment = "I am A" ; 

    public function getComment() { 
     return $this -> comment ; 
    } 
} 

class B extends A { 
    protected $comment = "I am B" ; 
} 

$B=new B ; 

echo $B->getComment(); 
+1

Взгляните на это сообщение: [http://stackoverflow.com/questions/4280001/защищенный статический член-переменные] [1] [1]: http://stackoverflow.com/questions/4280001/protected-static-member-va riables –

+0

Удивительный!Я не знал, что поздняя статическая привязка - это действительно полезно :) – user28490

ответ

3

Функция, которую вы ищете, называется «поздняя статическая привязка» и равна documented here.

Короткий вариант заключается в том, что для того, чтобы заставить статические переменные работать так, как вы хотите, вам необходимо использовать static:: вместо self::.

Примечание: это работает только в PHP 5.3 и выше.

+0

Спасибо, сэр, я примет ваш ответ, как только моя очень маленькая репутация позволит мне это сделать :) – user28490

1

Да перезаписать его, но в вашем случае, если вы не сделали перезапись getComment метод parent class.

если вы пытаетесь

class B extends A { 
protected static $comment = "I am B" ; 
public static function getComment() { 
    return self :: $comment; 
} 
} 

затем отобразится I am B.

что на самом деле вы делаете вызова getComment метод b class, который не существует в child class так пузыриться к parent class способу и отображения результатов.

+0

Но почему она работает в контексте экземпляра, например: класс A { \t protected $ comment = "I am A"; \t общественная функция getComment() { \t \t return $ this -> comment; \t} } класс B extends A { \t защищенный $ comment = "I am B"; } $ B = новый B; echo $ B-> getComment(); // echo I am B – user28490

+0

@ user28490 попробуй, он не покажет Я В –

+0

Парма благодарит за пояснения, теперь имеет смысл – user28490

0

Вы должны использовать ПРОСРОЧКУ СТАТИКИ ОБЯЗАТЕЛЬНОЕ

class A { 
protected static $comment = "I am A" ; 
public static function getComment() { 
    return static :: $comment; 
} 
} 

class B extends A { 
protected static $comment = "I am B" ; 
} 

echo B::getComment() ; // echoes "I am A" 

Я надеюсь, что это какой-то смысл