Запрос разъяснений о процедуре ООП в 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 ребенок не перезаписывает родительский? Спасибо за разъяснения.
== РЕДАКТИРОВАТЬ ==
Также мой вопрос, в чем же разница между статическим и экземпляром, потому что в экземпляре он работает:
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();
3 ответа
Функция, которую вы ищете, называется "поздним статическим связыванием" и описана здесь.
Короче говоря, чтобы статические переменные работали так, как вы хотите, вам нужно использовать static::
вместо self::
,
Примечание: это работает только в PHP 5.3 и выше.
Да, это перезаписать, но в вашем случае вы не перезаписали 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
метод и результат отображения.
Вам нужно использовать LATE STATIC BINDING
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"
Я надеюсь, что это имеет смысл