PHP

Магические методы и предопределенные константы в PHP

В PHP имеется набор специальных предопределенных констант и магических методов для ваших проектов. В отличие от обычных констант, которые можно устанавливать с помощью define(), значение предопределенных констант зависит от того, где они используются, и является информацией только для чтения о коде и PHP системе. Магические методы можно использовать в ваших классах для получения доступа к специальному функционалу PHP.

В данном уроке мы рассмотрим несколько полезных предопределенных констант и магических методов с примерами использования в коде.

Предопределенные константы
Предопределённые константы используются для получения информации о вашем коде. Имя такой константы пишется заглавными буквами между сдвоенными подчеркиваниями, например, __LINE__ и __FILE__ . Вот несколько полезных предопределённых констант, доступных в PHP:

__LINE__ возвращает номер строки в исходном файле, где используется константа:
<?php
echo "Номер строки: " . __LINE__; // Номер строки: 2
echo "Номер строки: " . __LINE__; // Номер строки: 3
echo "Номер строки: " . __LINE__; // Номер строки: 4

__FILE__ представляет имя файла, включая полный путь:
<?php
echo "Имя файла: " . __FILE__;
// Имя файла: C:\wamp\www\index.php

__DIR__ представляет только путь к файлу:
<?php
echo "Путь к файлу: " . __DIR__;
// Путь к файлу: C:\wamp\www

__CLASS__ представляет имя текущего класса:
<?php
class Sample
{
    public function __construct() {
        echo __CLASS__;
    }
}
$obj = new Sample(); // Sample

__FUNCTION__ представляет имя текущей функции:
<?php
function mySampleFunc() {
    echo  "Имя функции: " . __FUNCTION__;
}
mySampleFunc(); //Имя функции: mySampleFunc

__METHOD__ представляет имя текущего метода:
<?php
class Sample
{
    public static function myMethod() {
        echo  "Имя метода: " . __METHOD__;
    }
}
Sample::myMethod(); // Имя метода: myMethod

__NAMESPACE__ представляет имя текущего пространства имен:
<?php
namespace MySampleNS;
echo "Пространство имен: " . __NAMESPACE__;
// Пространство имен: MySampleNS


Магические методы
Магические методы представляют крючки для специального функционала PHP. Их имена пишутся маленькими буквами с двумя предшествующими подчеркиваниями, например, __construct() и __destruct().

__construct() - магический метод, который PHP вызывает для создания экземпляра вашего класса. Он принимает любое количество аргументов.
<?php
class MySample
{
    public function __construct($foo) {
        echo __CLASS__ . " конструктор вызывается с аргументом $foo.";
    }
}
$obj = new MySample(42);
// MySample конструктор вызывается с аргументом 42

__destruct()- магический метод, который вызывается, когда объект уничтожается коллектором PHP. Данный метод не принимает аргументов и обычно используется для выполнения специальных операций, например, для закрытия соединения с базой данных.
<?php
class MySample
{
    public function __destruct() {
        echo__CLASS__ . " вызвал деструктор.";
    }
}
$obj = new MySample; // MySample вызвал деструктор

Следующие несколько магических методов предназначены для манипуляций со свойствами, и представляют способ для PHP обработать обращения ко свойствам и методам, которые не были определены (или недоступны).

PHP вызывает метод __get() в получающем контексте, если свойство не определено (или недоступно). Метод принимает один аргумент - имя свойства. Он должен вернуть значение, которое будет обрабатываться как значение свойства.

Метод __set() вызывается для неопределенного свойства в задающем контексте. Данный метод принимает два аргумента, имя свойства и значение.
<?php
class MySample
{
    private $myArray = array();
    public function __set($prop, $value) {
        $this->myAarray[$prop] = $value;
    }
    public function __get($prop) {
        return $this->myArray[$prop];
    }
    public function __isset($prop) {
        return isset($this->myArray[$prop]);
    }
    public function __unset($prop) {
        unset($this->myArray[$prop]);
    }
    public function __toString() {
        return __CLASS__ . ":" . $this->name;
    }
}
$obj = new MySample();
if (!isset($obj->name)) {
    $obj->name = "Alireza";
}
echo $obj->name; // Alireza
echo $obj; // MySample:Alireza

В выше приведенном коде свойство name не определено в классе. В коде предпринимается попытка назначить данному свойству значение “Alireza” и PHP вызывает магический метод __set(). Он получает “name” в качестве аргумента $prop и “Alireza” как $value, и сохраняет значение в частном массиве $myArray. Метод __get() работает в схожей манере. При выводе $obj->name вызывается метод __get() и ему передается значение “name” как аргумент $prop.

Есть и другие магические методы, которые помогают манипулировать недоступными свойствами, как в приведенном примере: __isset(), __unset() и __toString(). Оба метода __isset() и __unset() запускаются функциями с такими же именами, но без подчеркиваний в PHP.

__isset() проверяет, установлено свойство или нет. Данный метод принимает один аргумент - свойство, которое надо проверить. Метод __unset()принимает один аргумент, имя свойства, которое нужно сбросить.

Во многих случаях удобно представление объекта как строки, например, для вывода пользователю или другому процессу. Обычно PHP представляет объект как идентификатор в памяти, что плохо для таких функций. Метод __toString() помогает представить объект как строку. Метод запускается во многих ситуациях, где объект используется как строка, например, echo "Hello $obj". Также его можно вызвать непосредственно, как любой другой публичный метод.
Теги:
Магические методы, предопределенные константы
Добавлено: 06 Мая 2018 18:36:29 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Гость
14 Марта 2025 13:59:05
t9669t
Гость
14 Марта 2025 13:59:05
gpxtll
Гость
14 Марта 2025 13:59:05
s7xjw8
Гость
14 Марта 2025 13:59:04
rmir9h
Гость
14 Марта 2025 13:59:04
6un801
Гость
14 Марта 2025 13:59:04
hcexxz
Гость
14 Марта 2025 13:59:03
now4lr
Гость
11 Марта 2025 15:05:38
fa6rw9
Гость
11 Марта 2025 15:05:37
vfphof
Гость
11 Марта 2025 15:05:37
hyj9iw
Гость
11 Марта 2025 15:05:37
4ebvzu
Гость
11 Марта 2025 15:05:37
7qs6y5
Гость
11 Марта 2025 15:05:36
fc22ez
Гость
11 Марта 2025 15:05:36
hw8fme