Определяем имя текущего класса

14th Февраль 2013 | Категории: PHP | Метки: ,

Казалось бы, простая задача: определить имя текущего класса. У 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.

Subscribe without commenting


Пока комментариев нет.