2016-10-20 3 views
1

Вызов get_called_class() в PHP из статической функции дает вам имя класса функции, включая пространство имен, если оно вызвано из-за этого пространства имен.Получить имя класса исполняемой статической функции без пространства имен

Есть ли способ получить имя класса без пространства имен?

(Очевидно, я понимаю, что можно было бы рассмотреть строку, возвращаемую get_called_class() и сделать некоторый хак вещи, но я надеюсь, есть менее хак способ сделать это)

+0

Да, вы должны сделать somethink так: 'array_pop (взрываются ('\\', \ App \ Vendor \ Foo :: Foo()))' – felipsmartins

+0

@ felipsmartins Спасибо за интерес к моему вопросу, но если вы хотите попытаться ответить на вопрос, я думаю, что правила SO диктуют, что это должно быть сделано в форме ответа, а не комментария. – StubbornShowaGuy

+0

Кто-то alse скопирует это sugestion как ответ скоро ... :) – felipsmartins

ответ

1

Получая имя класса без a пространство имен

Да, вы можете сделать это, используя ReflectionClass. Поскольку ваш вопрос относится к делать это изнутри статический метод, вы можете получить имя класса как так:

$reflect = new \ReflectionClass(get_called_class()); 
$reflect->getShortName(); 

Это использует конструктор ReflectionClass, передавая строку с полностью пространством имен имени класса, который будет проверяться.

Существует аналогичный вопрос в How do I get an object's unqualified (short) class name?, однако он не ссылается на это в статическом методе, и поэтому примеры передают экземпляр объекта в конструктор ReflectionClass.

+1

Спасибо. Я принимаю ваш ответ на том основании, что это лучшее решение, о котором я знаю, и он достаточно неадекватен, чтобы его не считали хаки (по моему скромному мнению). – StubbornShowaGuy

+0

Обязательно проверьте, насколько эффективно это решение, если вызываемый класс растет. – dashaxiong

0

Вы можете использовать:

/** 
* Get the class "basename" of the given object/class. 
* 
* @param string|object $class 
* @return string 
*/ 
function class_basename($class) 
{ 
    $class = is_object($class) ? get_class($class) : $class; 

    return basename(str_replace('\\', '/', $class)); 
} 
Смежные вопросы