PHP предоставляет набор специальных предопределенных констант и магических методов для ваших программ. В отличие от констант, которые вы установили бы с помощью define()
, значение констант зависит от того, где они используются в вашем коде, и используются для доступа к информации только для чтения о вашем коде и PHP. Магические методы — это зарезервированные имена методов, которые вы можете использовать в своих классах для подключения к специальным функциям PHP.
Если вы еще не слышали о магических методах и константах PHP, то эта статья для вас! Я рассмотрю некоторые из наиболее полезных и как вы можете использовать их в своем коде.
Предопределенные константы
Предопределенные константы используются для доступа к информации о вашем коде. Здесь константы пишутся заглавными буквами между двумя подчеркиваниями, например, __LINE__
и __FILE__
. Вот некоторые из полезных констант, которые доступны через PHP:
-
__LINE__
возвращает номер строки в исходном файле, в котором появляется константа, например:
<?php echo "line number: " . __LINE__; // line number: 2 echo "line number: " . __LINE__; // line number: 3 echo "line number: " . __LINE__; // line number: 4
__FILE__
представляет имя вашего файла, включая полный путь, например: <?php echo "the name of this file is: " . __FILE__; // the directory and name of file is: C:wampwwwindex.php
__DIR__
представляет только путь к файлу: <?php echo "the directory of this file is: " . __DIR__; // the directory of this file is: C:wampwww
__CLASS__
возвращает имя текущего класса: <?php class Sample { public function __construct() { echo __CLASS__; } } $obj = new Sample(); // Sample
__FUNCTION__
возвращает имя текущей функции: <?php function mySampleFunc() { echo "the name the function is: " . __FUNCTION__; } mySampleFunc(); //the name of function is: mySampleFunc
__METHOD__
представляет имя текущего метода: <?php class Sample { public static function myMethod() { echo "the name of method is: " . __METHOD__; } } Sample::myMethod(); // the name of the method is: myMethod
__NAMESPACE__
возвращает имя текущего пространства имен: <?php namespace MySampleNS; echo "the namespace is: " . __NAMESPACE__; // the name space is: MySampleNS
Магические методы
Магические методы обеспечивают привязку к специальному поведению PHP. В отличие от констант ранее, их имена пишутся строчными / верблюжьими буквами с двумя ведущими подчеркиваниями, такими как __construct()
и __destruct()
.
__construct()
— это магический метод, который PHP вызывает для создания экземпляров объектов вашего класса. Может принимать любое количество аргументов.
<?php class MySample { public function __construct($foo) { echo __CLASS__ . " constructor called with $foo."; } } $obj = new MySample(42); // MySample constructor called with 42
Как следует из названия, метод __destruct()
вызывается, когда объект уничтожается сборщиком мусора в PHP. Он не принимает аргументов и обычно используется для выполнения любых необходимых операций очистки, таких как закрытие соединения с базой данных.
<?php class MySample { public function __destruct() { echo__CLASS__ . " destructor called."; } } $obj = new MySample; // MySample destructor called
Наши следующие магические методы имеют дело с перегрузкой свойств и предоставляют 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
с<?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
свойства не определено в классе. Я пытаюсь присвоить ему значение «mysample», и PHP вызывает магический метод __set()
. Он получает «name» в качестве аргумента $prop
и «Alireza» в качестве $value
, и я сохраняю значение в приватном массиве $myArray
. Метод __get()
работает аналогичным образом; когда я $obj->name
, вызывается метод __get()
и в качестве аргумента $prop
передается «name».
Существуют и другие магические методы, которые помогают нам извлекать и проверять недоступные переменные-члены, которые появляются в примере кода: __isset()
, __unset()
и __toString()
. И __isset()
и __unset()
запускаются функциями с одинаковым именем (без подчеркивания) в PHP.
__isset()
проверяет, установлено ли свойство или нет, и принимает один аргумент, то есть свойство, которое мы хотим проверить. __unset()
получает один аргумент, который является именем свойства, которое программа хочет сбросить.
Во многих случаях полезно представлять объект в виде строки, например, для вывода пользователю или другому процессу. Обычно PHP представляет их как идентификатор в памяти, что не очень хорошо для нас. Метод __toString()
помогает нам представить объект в виде строки. Метод запускается в любой ситуации, когда объект используется в качестве строки, например: echo "Hello $obj"
. Он также может быть вызван напрямую, как и любой другой обычный публичный метод, который предпочтительнее хаков, таких как добавление пустой строки для принудительного принуждения.
Резюме
ООП программирование может создавать более поддерживаемый и тестируемый код. Это помогает нам создавать лучший и стандартный код PHP. Кроме того, это позволяет использовать магические методы и константы, которые делает PHP доступными.
Изображение через Степана Капля / Shutterstock