У меня два класса: Action
и MyAction
. Последний объявлен как:
class MyAction extends Action {/* some methods here */}
Все, что мне нужно, это метод в Action
классе (только в нем, потому что будет много унаследованных классов, и я не хочу реализовывать этот метод во всех из них), который вернет имя класса из статического вызова. Вот о чем я говорю:
Class Action {
function n(){/* something */}
}
И когда я это называю:
MyAction::n(); // it should return "MyAction"
Но каждое объявление в родительском классе имеет доступ только к __CLASS__
переменной родительского класса , которая имеет значение «Action».
Есть ли способ сделать это?
источник
get_called_class()
:)new static();
изнутри частного статического метода (с использованием xampp в Windows и php> 5.5).:s
Начиная с версии 5.5 вы можете использовать
class
ключевое слово для разрешения имени класса , что будет намного быстрее, чем выполнение вызовов функций. Также работает с интерфейсами.// C extends B extends A static::class // MyNamespace\ClassC when run in A self::class // MyNamespace\ClassA when run in A parent::class // MyNamespace\ClassB when run in C MyClass::class // MyNamespace\MyClass
источник
Это не идеальное решение, но оно работает на PHP <5.3.0.
Код скопирован с septuro.com
if(!function_exists('get_called_class')) { class class_tools { static $i = 0; static $fl = null; static function get_called_class() { $bt = debug_backtrace(); if (self::$fl == $bt[2]['file'].$bt[2]['line']) { self::$i++; } else { self::$i = 0; self::$fl = $bt[2]['file'].$bt[2]['line']; } $lines = file($bt[2]['file']); preg_match_all('/([a-zA-Z0-9\_]+)::'.$bt[2]['function'].'/', $lines[$bt[2]['line']-1], $matches); return $matches[1][self::$i]; } } function get_called_class() { return class_tools::get_called_class(); } }
источник
Теперь (когда вышла версия 5.3) все довольно просто:
http://php.net/manual/en/function.get-called-class.php
источник
class MainSingleton { private static $instances = array(); private static function get_called_class() { $t = debug_backtrace(); return $t[count($t)-1]["class"]; } public static function getInstance() { $class = self::get_called_class(); if(!isset(self::$instances[$class]) ) { self::$instances[$class] = new $class; } return self::$instances[$class]; } } class Singleton extends MainSingleton { public static function getInstance() { return parent::getInstance(); } protected function __construct() { echo "A". PHP_EOL; } protected function __clone() {} public function test() { echo " * test called * "; } } Singleton::getInstance()->test(); Singleton::getInstance()->test();
источник
В доступных версиях PHP нет возможности делать то, что вы хотите. Решение Пола Диксона - единственное. Я имею в виду пример кода, поскольку функция поздних статических привязок, о которой он говорит, доступна с PHP 5.3, которая находится в стадии бета-тестирования.
источник
(PHP 5> = 5.3.0, PHP 7)
get_called_class - Имя класса «Поздняя статическая привязка».
<?php class Model { public static function find() { return get_called_class(); } } class User extends Model { } echo User::find();
эта ссылка может быть полезна
источник