Определяем имя текущего класса
Казалось бы, простая задача: определить имя текущего класса. У PHP есть несколько функций и констант для получения имени класса. Но все они возвращают результат вместе с пространством имен (namespace). Получить только имя класса невозможно! В конце статьи – маленький бонус: преимущества от использования PHP 5.4.
Простой код, демонстрирующий это недоразумение:
<?php namespace Core\Battle; class Base { public function __construct() { echo __CLASS__; echo get_class($this); } } $base = new Base; |
Получаем на выходе:
Core\Battle\Base
Core\Battle\Base
Какую бы я функцию ни использовал – всегда возвращается пространство имен перед именем класса.
Хорошо. Попытаемся получить имя класса. Задача несложная: необходимо разделить строку по символу \
и взять последний элемент массива. Алгоритм такой:
$str = get_class($this); // получаем имя текущего класса $temp = explode('\\', $str); // разделяем строку по символу "\" $class_name = end($temp); // выбираем последний элемент массива |
Но запись в три строки мне лично не нравится… Что если объединить их?
$str = get_class($this); $class_name = end(explode('\\', $str)); |
Такой код великолепно работает в PHP 5.4.
Но вот в PHP 5.3 получаем такое исключение: «Only variables should be passed by reference
«, так как функция end
принимает на вход массив по ссылке, а мы пытаемся передать результат работы функции explode
, то есть обычный массив. В итоге оказывается, что подавляющее большинство функций для работы с массивами работает с ними только по ссылке. Чтобы компактно записать в PHP 5.3 требуется конструкция:
$str = get_class($this); $class_name = join('', array_slice(explode('\\', $str), -1)); |
Лишний повод обновиться до PHP 5.4.