пузырчатая пленка

Все ленты — последние статьи

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

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

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


Предопределенные константы

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

__LINE__ возвращает номер строки в исходном файле, где используется константа:
1 <?php
2 echo "Номер строки: " . __LINE__; // Номер строки: 2
3 echo "Номер строки: " . __LINE__; // Номер строки: 3
4 echo "Номер строки: " . __LINE__; // Номер строки: 4
__FILE__ представляет имя файла, включая полный путь:
1 <?php
2 echo "Имя файла: " . __FILE__;
3 // Имя файла: C:wampwwwindex.php
__DIR__ представляет только путь к файлу:
1 <?php
2 echo "Путь к файлу: " . __DIR__;
3 // Путь к файлу: C:wampwww
__CLASS__ представляет имя текущего класса:
1 <?php
2 class Sample
3 {
4 public function __construct() {
5 echo __CLASS__;
6 }
7 }
8 $obj = new Sample(); // Sample
__FUNCTION__ представляет имя текущей функции:
1 <?php
2 function mySampleFunc() {
3 echo "Имя функции: " . __FUNCTION__;
4 }
5 mySampleFunc(); //Имя функции: mySampleFunc
__METHOD__ представляет имя текущего метода:
1 <?php
2 class Sample
3 {
4 public static function myMethod() {
5 echo "Имя метода: " . __METHOD__;
6 }
7 }
8 Sample::myMethod(); // Имя метода: myMethod
__NAMESPACE__ представляет имя текущего пространства имен:
1 <?php
2 namespace MySampleNS;
3 echo "Пространство имен: " . __NAMESPACE__;
4 // Пространство имен: MySampleNS


Магические методы

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

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

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

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

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

Метод __set() вызывается для неопределенного свойства в задающем контексте. Данный метод принимает два аргумента, имя свойства и значение.
01 <?php
02 class MySample
03 {
04 private $myArray = array();
05 public function __set($prop, $value) {
06 $this->myAarray[$prop] = $value;
07 }
08 public function __get($prop) {
09 return $this->myArray[$prop];
10 }
11 public function __isset($prop) {
12 return isset($this->myArray[$prop]);
13 }
14 public function __unset($prop) {
15 unset($this->myArray[$prop]);
16 }
17 public function __toString() {
18 return __CLASS__ . ":" . $this->name;
19 }
20 }
21 $obj = new MySample();
22 if (!isset($obj->name)) {
23 $obj->name = "Alireza";
24 }
25 echo $obj->name; // Alireza
26 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". Также его можно вызвать непосредственно, как любой другой публичный метод.

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: phpmaster.com/magic-methods-and-predefined-constants-in-php/
Перевел: Сергей Фастунов