Подводные камни определения имени текущего класса

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

Продолжаем тему работы с именем текущего класса.
Задача – определить имя текущего класса. Читаем мануал и находим множество способов выполнения задачи.

Способы определения класса

__CLASS__ – «Волшебная» константа PHP. Возвращает имя класса, в котором была вызвана (примеры ниже).

get_class(obj) – Функция. Возвращает имя класса, к которому принадлежит объект.

get_class() – Вернет имя класса, в котором была вызвана. Поведение аналогично константе __CLASS__.

get_called_class() – Функция. Добавлена в PHP 5.3. Возвращает имя класса, в котором была вызвана. Использует «позднее статическое связывание».

Что это все означает на практике?

Обычные методы

Предположим, есть два класса:

<?php namespace Core\Battle;
 
class Base {
 
	public function test() {
		echo __CLASS__;
		echo get_class();
		echo get_class($this);
		echo get_called_class();
	}
}
 
class Ext extends Base {}

Попробуем выполнить:

$base = new Base;
$base->test();
 
$ext = new Ext;
$ext->test();

Для базового класса мы получим результаты:
Core\Battle\Base
Core\Battle\Base
Core\Battle\Base
Core\Battle\Base

Для унаследованного:
Core\Battle\Base
Core\Battle\Base
Core\Battle\Ext
Core\Battle\Ext

Статические методы

Добавим модификатор static к функции test и вызовем её статически:

Base::test();
 
Ext::test();

Для базового класса мы получим результаты:
Core\Battle\Base
Core\Battle\Base
Core\Battle\Base
Core\Battle\Base

Для унаследованного:
Core\Battle\Base
Core\Battle\Base
Core\Battle\Base
Core\Battle\Ext

Определение класса для объекта

$base = new Base;
echo get_class($base);
 
$ext = new Ext;
echo get_class($ext);

На выходе получим, соответственно:

Core\Battle\Base

Core\Battle\Ext

Выводы

  • Если вы используете версию PHP 5.2 или ниже – обновитесь. Давно пора.
  • Константа __CLASS__ может быть использована при явном создании метода в классе. Если метод унаследован от родителя – вернет класс родителя.
  • Внутри самих классов удобнее всего использовать функцию get_called_class(). Возвращает правильный результат даже при наследовании метода.
  • Чтобы определить класс объекта, используйте функцию get_class(obj).
  • Все перечисленные способы возвращают имя класса вместе с пространством имен. Чтобы определить именно имя класса, воспользуйтесь советом из статьи «Определяем имя текущего класса».

Subscribe without commenting


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