Статьи

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

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