Я немного смущен этим. Я разрабатываю ORM-класс, который пытается вести себя аналогично ActiveRecord в ruby на рельсах, но это не относится к делу.
Я пытаюсь сказать, что мой класс широко использует статическое наследование атрибутов, особенно для обработки баз данных и таблиц. Мой вопрос в том, должен ли я использовать 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