Подводные камни определения имени текущего класса
Продолжаем тему работы с именем текущего класса.
Задача – определить имя текущего класса. Читаем мануал и находим множество способов выполнения задачи.
Способы определения класса
__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)
. - Все перечисленные способы возвращают имя класса вместе с пространством имен. Чтобы определить именно имя класса, воспользуйтесь советом из статьи «Определяем имя текущего класса».