Если вы любите баловаться с наследованием классов, то рано или поздно сталкиваетесь с задачей когда нужно узнать имя класса в контексте которого выполняется тот или иной код. Однако, стандартные методы по типу использования магической константы __CLASS__ или get_class($this) возвращают имя класса с его полным неймспейсом. Т.е. вы хотите получить LockHandler, но получаете Component\Filesystem\LockHandler.
Естественно, неокрепшему уму придёт сразу мысль: разбить строку на фрагменты разделённые символом «\» и взять последний фрагмент. Однако, это не самое лучшее решение. Существует ещё одно более простое, быстрое и нативное решение: использование рефлексии!
$classname = (new \ReflectionClass($this))->getShortName();
PHP фреймворк Laravel предлагает ещё один вариант:
/** * 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)); }
Также на просторах интернета встречаются и другие варианты:
$classname = substr($classname, strrpos($classname, '\\') + 1);
$classname = substr(strrchr(__CLASS__, "\\"), 1);
$path = explode('\\', __CLASS__); $classname = array_pop($path);
Независимые исследования говорят, что вариант с рефлексией наиболее производительный. Однако, данные о потреблении памяти отсутствуют.
Способ Итерации Среднее время Операций в секунду ------------------- ------------ ----------------- ------------------- explode + array_pop [10 000 ] [0.0000020221710] [494 518] substr + strrchr [10 000 ] [0.0000017177343] [582 162] Reflection [10 000 ] [0.0000015984058] [625 623]