Расширение статических классов PHP

Я боролся в этой области уже несколько дней, и я пришел к выводу, но поскольку вывод не был тем, что я искал, прежде чем я сдадусь, я попытаюсь посмотреть, что говорят другие люди. Вера умирает последней …

Предположим, у нас есть суперкласс (называемый «Супер») и подкласс (называемый «Sub»).

class Super { protected static $title = 'super'; public static function get_class_name() { echo __CLASS__; } public static function get_title() { echo self::$title; } } class Sub extends Super { protected static $title = 'sub'; } 

Теперь вы, вероятно, ожидаете, что, поскольку Sub расширяет Super, Sub теперь наследует все методы Super, однако, похоже, он получает только ссылки на методы Sub.

Я говорю это, потому что, если я позвоню:

 Sub::get_class_name(); 

выход «Super», а не «Sub».

И если я позвоню:

 Sub::get_title(); 

опять же, вывод «супер», и я даже объявляю $ title в Sub.

Таким образом, это означает, что когда я вызываю унаследованную статическую функцию, область действия функции будет супер-классом, а не тем, к которому обращается вызов (даже если вы печатаете обратную трассировку, это покажет, что вызов был сделан над суперклассом !!!), и для того, чтобы получить область действия в качестве подкласса, на который делается вызов, мне нужно повторно использовать этот метод внутри этого подкласса. Ну, такого рода побеждает цель продления занятий, не так ли?

Поэтому мой вопрос: могу ли я когда-либо расширить статический класс, вызвать один из унаследованных методов и обладать областью подкласса? или, по крайней мере, иметь возможность идентифицировать его имя класса? И если нет, то почему я хотел бы расширить статические классы?

Благодаря!

Related of "Расширение статических классов PHP"

Опять же, это невозможно до PHP 5.3.0.

Поздняя статическая привязка была введена в PHP 5.3.0 и позволяет выполнять именно то, что вы хотите, используя ключевое слово static .

 class Super { protected static $title = 'super'; public static function get_class_name() { echo __CLASS__; } public static function get_title() { echo static::$title; } } class Sub extends Super { protected static $title = 'sub'; } 

get_class_name() все равно будет возвращать Super хотя __CLASS__ всегда возвращает текущий класс, который объявляется запущенным способом (вроде как __FILE__ который всегда возвращает текущий файл независимо от того, включил его или нет).

Для этого у вас нет выбора, кроме как повторно объявить функцию в классе Sub .

 class Super { protected static $title = 'super'; public static function get_class_name() { echo __CLASS__; } public static function get_title() { echo static::$title; } } class Sub extends Super { protected static $title = 'sub'; public static function get_class_name() { echo __CLASS__; } } 

Вы можете использовать get_called_class() чтобы получить имя класса вызываемого вами класса, даже если он является статичным. Вам не нужно объявлять его нигде.

Из примера Андрея:

 class Super { public static function get_class1_name() { echo __CLASS__; } public static function get_title() { echo get_called_class(); } } class Sub extends Super { public static function get_class2_name() { echo __CLASS__; } } Sub::get_title(); // Echos Sub. Sub::get_class1_Name(); // echos super Sub::get_class2_Name(); // echos sub 

Поэтому вам не нужно объявлять какие-либо переменные.

К счастью, я что-то делаю для меня, поэтому я сказал, вверните его, я использую PHP5.3. Но даже в этом случае мне не нравится, что я должен обновлять «get _class _name» в каждом классе, возможно, я расширяюсь, как 10 классов. Поэтому я придумал это решение:

 class Super { protected static $classname = __CLASS__; public static function get_classname($name) { static::$classname = $name; } public static function get_classname() { return static::$classname; } } class Sub1 extends Super { } class Sub2 extends Super { } class Sub3 extends Super { } $classes = get_declared_classes(); foreach($classes as $k => $v) { if (is_subclass_of($v, 'Super')) { $v::set_classname($v); } } echo Sub1::get_classname(); // Sub1 echo Sub2::get_classname(); // Sub2 echo Sub3::get_classname(); // Sub3 

Это может показаться немного грязным, но я не думаю, что это так плохо. После этого вы можете, наконец, расширить статические методы без повторного объявления методов.