PHP Может static :: replace self ::?

Я немного смущен этим. Я разрабатываю ORM-класс, который пытается вести себя аналогично ActiveRecord в ruby ​​на рельсах, но это не относится к делу.

Я пытаюсь сказать, что мой класс широко использует статическое наследование атрибутов, особенно для обработки баз данных и таблиц. Мой вопрос в том, должен ли я использовать self :: вообще?

Solutions Collecting From Web of "PHP Может static :: replace self ::?"

Вы должны спросить себя: «Я нацелен на проблему с адекватным подходом?»

self:: и static:: делают две разные вещи. Например, self:: или __CLASS__ являются ссылками на текущий класс, поэтому в определенной области он не будет достаточным для статического вызова вперёд.

Что произойдет в наследство?

 class A { public static function className(){ echo __CLASS__; } public static function test(){ self::className(); } } class B extends A{ public static function className(){ echo __CLASS__; } } B::test(); 

Это напечатает

 A 

С другой стороны, со static:: Он имеет ожидаемое поведение

 class A { public static function className(){ echo __CLASS__; } public static function test(){ static::className(); } } class B extends A{ public static function className(){ echo __CLASS__; } } B::test(); 

Это напечатает

 B 

Это называется поздней статической привязкой в PHP 5.3.0 . Он решает ограничение вызова класса, на который ссылались во время выполнения .

Имея это в виду, я думаю, что вы теперь можете увидеть и решить проблему адекватно. Если вы наследуете несколько статических членов и нуждаетесь в доступе к родительскому и дочернему элементам self:: не хватает.

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

 <?php class Parent_{ protected static $x = "parent"; public static function makeTest(){ echo "self => ".self::$x."<br>"; echo "static => ".static::$x; } } class Child_ extends Parent_{ protected static $x = "child"; } echo "<h4>using the Parent_ class</h4>"; Parent_::makeTest(); echo "<br><h4>using the Child_ class</h4>"; Child_::makeTest(); ?> 

и вы получите этот результат:

с использованием класса Parent_

  • self => parent
  • static => parent

использование класса Child_

  • self => parent
  • static => child