Магические константы в PHP
Введение
PHP предоставляет девять магических констант, которые могут использоваться в коде PHP приложения.
Они магические
, потому что определяются во время компиляции, в отличие от обычных констант определяемых во время выполнения. Это означает, что их значения могут меняться в зависимости от того, где они используются в вашем коде.
Признаться, я нечасто использую магические константы в своём коде. Чаще всего я обращаюсь к константе ::class. Но всё равно считаю, что о них стоит знать, так как в некоторых ситуациях они могут быть полезны.
В этой статье мы рассмотрим каждую из констант и разберёмся, что они делают.
__FUNCTION__
Магическая константа __FUNCTION__ возвращает имя функции, в которой она используется.
Если она используется вне функции или метода, то вернёт пустую строку.
Использование __FUNCTION__ в функции
Предположим, есть функция myFunction:
function myFunction()
{
echo __FUNCTION__;
}Вызов, приведённой выше функции, выведет: myFunction.
Использование __FUNCTION__ в методе класса
Предположим, есть класс с методом myMethod:
class MyClass
{
public function myMethod()
{
echo __FUNCTION__;
}
}Вызов метода myMethod приведёт к выводу: myMethod.
Использование __FUNCTION__ в анонимной функции
Предположим, есть анонимная функция:
$myFunction = function () {
echo __FUNCTION__;
};Вызов переменной $myFunction выведет: {closure}.
__METHOD__
Магическая константа __METHOD__ возвращает имя метода, в котором она используется, и класса, в котором она записана.
Если она используется вне функции или метода, то вернёт пустую строку.
Использование __METHOD__ в методе класса
Предположим, есть класс App\Utilities\MyClass с методом myMethod:
namespace App\Utilities;
class MyClass
{
public function myMethod()
{
echo __METHOD__;
}
}Вызов метода myMethod приведёт к выводу: App\Utilities\MyClass::myMethod.
Использование __METHOD__ в методе родительского класса
Константа __METHOD__ возвращает имя класса и метода, в котором она записана. Это означает, что если вы используете __METHOD__ в родительском классе, то все дочерние классы будут использовать имя родительского класса.
Например, есть родительский класс App\Utilities\ParentClass:
namespace App\Utilities;
class ParentClass
{
public function myMethod()
{
echo __METHOD__;
}
}И есть дочерний класс App\Utilities\ChildClass, расширяющий класс App\Utilities\ParentClass:
namespace App\Utilities;
class ChildClass extends ParentClass
{
// ...
}Вызов метода (new ChildClass())->myMethod() приведёт к выводу: App\Utilities\ParentClass::myMethod.
Использование __METHOD__ в функции
Если вызвать __METHOD__ в функции, то вывод будет таким же, как и __FUNCTION__. То есть будет выведено только имя функции.
Аналогично, если вызвать __METHOD__ в анонимной функции, вывод будет таким же, как и __FUNCTION__. То есть будет просто выведено {closure}.
__CLASS__
Магическая константа __CLASS__ возвращает имя класса, в котором она используется.
Если её использовать вне класса, она вернёт пустую строку.
Использование __CLASS__ в методе класса
Представьте, что есть следующий код:
namespace App\Utilities;
class MyClass
{
public function myMethod()
{
echo __CLASS__;
}
}Вызов метода myMethod приведёт к выводу: MyClass.
Использование __CLASS__ в родительском классе
Подобно магической константе __METHOD__, константа __CLASS__ возвращает имя класса, в котором она записана. Это означает, что если вы используете __CLASS__ в родительском классе, то будет использовано имя родительского класса, а не дочернего.
Например, есть родительский класс App\Utilities\ParentClass:
namespace App\Utilities;
class ParentClass
{
public function myMethod()
{
echo __CLASS__;
}
}И есть дочерний класс App\Utilities\ChildClass, расширяющий класс App\Utilities\ParentClass:
namespace App\Utilities;
class ChildClass extends ParentClass
{
// ...
}Вызов метода (new ChildClass())->myMethod() приведёт к выводу: App\Utilities\ParentClass.
Использование __CLASS__ в трейте
Если константа __CLASS__ используется внутри трейта, она вернёт имя класса, использующего этот трейт.
Например, есть трейт MyTrait:
namespace App\Utilities;
trait MyTrait
{
public function myMethod()
{
echo __CLASS__;
}
}И есть класс MyClass, использующий трейт MyTrait:
namespace App\Utilities;
class MyClass
{
use MyTrait;
}Вызов метода (new MyClass())->myMethod() приведёт к выводу: App\Utilities\MyClass.
::class
Магическая константа ::class возвращает полное имя класса.
Это магическая константа, которую я использую чаще всего, особенно в приложениях Laravel. Она помогает при работе с именами классов в виде строк.
Допустим, есть следующий класс, App\Utilities\MyClass:
namespace App\Utilities;
class MyClass
{
// ...
}Вызов App\Utilities\MyClass::class выведет: App\Utilities\MyClass.
Использование ::class в Laravel
Если вы разработчик Laravel, то наверняка видели, как эта константа используется для определения маршрутов и отношений между моделями.
Например, чтобы определить web маршрут в Laravel, можно сделать что-то вроде этого в файле routes/web.php:
use App\Http\Controllers\UserController;
Route::get('/users', [UserController::class, 'index']);Обратите внимание, что используется константа ::class для ссылки на класс UserController, что даёт App\Http\Controllers\UserController.
Аналогично, определяя отношения в моделях Laravel, можно сделать что-то вроде этого:
// app/Models/User.php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Model
{
public function posts(): HasMany
{
return $this->hasMany(Post::class);
}
}В приведённом выше примере используется константа ::class, для получения полного имени класса модели Post, что даёт App\Models\Post.
__TRAIT__
Магическая константа __TRAIT__ возвращает полное имя трейта, в котором она используется.
Если она используется вне трейта, то вернёт пустую строку.
Например, есть следующий трейт:
namespace App\Utilities;
trait MyTrait
{
public function myMethod()
{
echo __TRAIT__;
}
}И есть класс, использующий трейт MyTrait:
namespace App\Utilities;
class MyClass
{
use MyTrait;
}Вызов метода (new MyClass())->myMethod() приведёт к выводу: App\Utilities\MyTrait.
__NAMESPACE__
Магическая константа __NAMESPACE__ возвращает текущее пространство имён, в котором она используется.
Если файл не находится в пространстве имён, он вернёт пустую строку.
Например, есть следующий код:
namespace App\Utilities;
echo __NAMESPACE__;Выполнение приведённого выше кода приведёт к выводу: App\Utilities.
Подобно магическим константам __METHOD__ и __CLASS__, константа __NAMESPACE__ возвращает пространство имён файла, в котором она записана.
Например, есть родительский класс App\Utilities\ParentClass:
namespace App\Utilities;
class ParentClass
{
public function myMethod()
{
echo __NAMESPACE__;
}
}И есть дочерний класс App\Utilities\Child\ChildClass, расширяющий класс App\Utilities\ParentClass:
namespace App\Utilities\Child;
class ChildClass extends ParentClass
{
// ...
}Запуск метода (new ChildClass())->myMethod() приведёт к выводу: App\Utilities.
__LINE__
Магическая константа __LINE__ возвращает номер текущей строки файла, в котором она используется.
Например, есть следующий код:
<?php
// Пустая строка...
echo __LINE__;
Запуск приведённого выше кода выведет 5, потому что оператор echo __LINE__; находится в пятой строке файла.
__FILE__
Магическая константа __FILE__ возвращает полный путь и имя файла, в котором она используется.
Например, есть следующий код в файле, расположенном по адресу /Users/ashleyallen/my-app/index.php
echo __FILE__;Запуск приведённого выше кода выведет /Users/ashleyallen/my-app/index.php.
__DIR__
Магическая константа __DIR__ возвращает директорию файла, в котором она используется.
Например, есть следующий код в файле, расположенном по адресу /Users/ashleyallen/my-app/index.php.
echo __DIR__;Запуск приведённого выше кода выведет /Users/ashleyallen/my-app.
Стоит отметить, что константа __DIR__ не включает завершающий слэш, если каталог не является корневым.
То же значение, что и у __DIR__, можно получить с помощью dirname(__FILE__).
Заключение
Надеюсь, статья дала вам представление о магических константах, доступных в PHP.
О магических методах класса можно узнать в статье Магические методы PHP