Магические константы в 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