Магические константы в PHP

Источник: «Magic Constants in PHP»
Узнайте о девяти магических константах, предоставляемых 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

Дополнительные материалы

Предыдущая Статья

Маска изображения довольно удобна

Следующая Статья

Статистика версий PHP: Июль, 2024