Если вы любите баловаться с наследованием классов, то рано или поздно сталкиваетесь с задачей когда нужно узнать имя класса в контексте которого выполняется тот или иной код. Однако, стандартные методы по типу использования магической константы __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]

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *