Запрос разъяснений о процедуре ООП в 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"

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

Другие вопросы по тегам