Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
PHP включает ряд магических констант, значение которых изменяется в зависимости от контекста.
Значение константы __LINE__
, например, зависит от строки скрипта,
на которой указали константу. PHP разрешает «магические» константы
во время компиляции, в отличие от стандартных констант, которые PHP разрешает
во время выполнения. Специальные константы нечувствительны
к регистру, а список таких констант приводит следующий параграф:
Имя | Описание |
---|---|
__LINE__ |
Текущий номер строки файла. |
__FILE__ |
Полный путь и имя текущего файла с разрешёнными символическими ссылками. PHP возвращает имя подключённого файла, если константу указали внутри него. |
__DIR__ |
Каталог файла. PHP возвращает каталог подключённого файла, если константу
указали внутри подключаемого файла.
Значение константы эквивалентно вызову
dirname(__FILE__) . Имя каталога возвращается
без слеша в конце, если только это не корневой каталог.
|
__FUNCTION__ |
Название функции или {closure} для анонимной функции.
|
__CLASS__ |
Название класса. Название класса включает пространство имён, в котором объявили класс,
например Foo\Bar .
Внутри методов трейтов значение константы __CLASS__ равно названию класса, в котором вызывают метод трейта.
|
__TRAIT__ |
Имя трейта. Имя трейта включает пространство имён,
в котором объявили трейт, например: Foo\Bar .
|
__METHOD__ |
Имя метода класса. |
__PROPERTY__ |
Название свойства. Константа действует только внутри хука свойства. |
__NAMESPACE__ |
Имя текущего пространства имён. |
ClassName::class |
Абсолютное имя класса. |
Note that __CLASS__ and __METHOD__ both reference the class the code is written in, not whatever the object class is. E.g. if you have an object of class B inheriting from class A, any usage of __CLASS__ in class A is going to give "A".
If PHP is run inside a web server request there is an important difference between the __DIR__ constant and $_SERVER['DOCUMENT_ROOT'].
Where __DIR__ of a PHP script contained within a sub-folder will include the complete server path $_SERVER['DOCUMENT_ROOT'] will contain a server path up to the _root_ of the application. This can be helpful when for instance an auto-loader is defined in an include file sitting inside a sub-folder and where the classes are located in another folder at the root of the application.
<?php
namespace My\App {
class Api {
public static fetch() {
print __FUNCTION__ . "\n"; // outputs fetch
print __METHOD__ . "\n"; // outputs My\App\Api::fetch
}
}
Api::fetch();
}
namespace {
My\App\Api::fetch();
}
?>
__METHOD__ outputs a fully qualified method name; __FUNCTION__ when used in a method, outputs just the method name.