Магические методы и предопределенные константы в 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". Также его можно вызвать непосредственно, как любой другой публичный метод.

Источник: http://feedproxy.google.com/~r/ruseller/CdHX/~3/HrkGRJU7zIs/lessons.php

Читать комменты и комментировать

Добавить комментарий / отзыв



Защитный код
Обновить

Магические методы и предопределенные константы в PHP | | 2012-06-19 11:58:10 | | Статьи Web-мастеру | | В PHP имеется набор специальных предопределенных констант и магических методов для ваших проектов. В отличие от обычных констант, которые можно устанавливать с помощью define(), значение | РэдЛайн, создание сайта, заказать сайт, разработка сайтов, реклама в Интернете, продвижение, маркетинговые исследования, дизайн студия, веб дизайн, раскрутка сайта, создать сайт компании, сделать сайт, создание сайтов, изготовление сайта, обслуживание сайтов, изготовление сайтов, заказать интернет сайт, создать сайт, изготовить сайт, разработка сайта, web студия, создание веб сайта, поддержка сайта, сайт на заказ, сопровождение сайта, дизайн сайта, сайт под ключ, заказ сайта, реклама сайта, хостинг, регистрация доменов, хабаровск, краснодар, москва, комсомольск |
 
Поделиться с друзьями: