Статья
Магические методы PHP

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

25 февраля 2017

В PHP существуют так называемые "магические" методы, все они именуются с двойного подчеркивания. Посмотрев примеры использования магических методов, вы убедитесь что их магия очень легко объясняется.

 

 __construct()

Данный метод вызывается каждый раз при создании объекта класса.

class Cat {

   public function __construct($name = "") {
       print "Cat " . $name . " object created";
   }

}

$obj = new Cat("Barsik");

Результат выполнения:

Cat Barsik object created

 

 __destruct()

Данный метод вызывается при освобождении всех ссылок на объект или при завершении работы скрипта.

class Cat {

   public function __destruct() {
       print "Cat object destructed";
   }

}

$obj = new Cat();
unset($obj);

Результат выполнения:

Cat object destructed

 

 __call()

Данный метод вызывается при вызове недоступных методов класса.

class Cat {

   public function __call($name, $args) {
       print "Method " . $name . " called";
   }

}

$obj = new Cat();
$obj->test();

Результат выполнения:

Method test called

 

 __callStatic()

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

class Cat {

   public static function __callStatic($name, $args) {
       print "Method " . $name . " called";
   }

}

Cat::test();

Результат выполнения:

Method test called

 

 __set()

Данный метод вызывается при записи данных в недоступные свойства.

class Cat {

   public function __set($name, $value) {
       print "Set the " . $name . " property to " . $value;
   }

}

$obj = new Cat();
$obj->Name =  "Barsik";

Результат выполнения:

Set the Name property to Barsik

 

 __get()

Данный метод вызывается при чтении данных из недоступных свойств.

class Cat {

   public function __get($name) {
       print "Attempt to obtain the property " . $name;
   }

}

$obj = new Cat();
$name = $obj->Name;

Результат выполнения:

Attempt to obtain the property Name

 

 __isset()

Данный метод вызывается при использовании isset() или empty() на недоступных свойствах.

class Cat {

   public function __isset($name) {
       print "Checking the " . $name . " property";
   }

}

$obj = new Cat();
isset($obj->Tail);

Результат выполнения:

Checking the Tail property

 

 __unset()

Данный метод вызывается при использовании unset() на недоступных свойствах.

class Cat {

   public function __unset($name) {
       print "Trying to unset the " . $name . " property";
   }

}

$obj = new Cat();
unset($obj->Tail);

Результат выполнения:

Trying to unset the Tail property

 

 __sleep()

Данный метод вызывается перед выполнением функции serialize().

class Cat {

    private $ts;

    public function __sleep() {
        print "Runs before serialization";
        $this->ts = time();
    }

}

$obj = new Cat();
serialize($obj);
var_dump($obj);

Результат выполнения:

Runs before serialization object(Cat) (1) { ["ts":"Cat":private]=> int(1498638208) }

 

 __wakeup()

Данный метод вызывается перед выполнением функции unserialize().

class Cat {

	public $isUnserialize = false;

    public function __wakeup() {
        $this->isUnserialize = true;
    }

}

$obj = new Cat();
var_dump($obj->isUnserialize);

$serializedObj = serialize($obj);

$obj=unserialize($serializedObj);
var_dump($obj->isUnserialize);

Результат выполнения:

bool(false) bool(true)

 

 __toString()

Данный метод вызывается при попытке преобразования объекта в строку.

class Cat {

    public function __toString() {
        return "Hello! I am a cat.";
    }

}

$obj = new Cat();
print $obj;

Результат выполнения:

Hello! I am a cat.

 

 __invoke()

Данный метод вызывается при попытке выполнить объект как фукнцию.

class Cat {

    public function __invoke($arg) {
        echo "An attempt to execute an object as a function, passing an argument " . $arg;
    }

}
$obj = new Cat();
$obj("Test");

Результат выполнения:

An attempt to execute an object as a function, passing an argument Test

 

 __clone()

Данный метод вызывается перед клонированием объекта.

class Cat {

    public $cloned = false;

    public function __clone() {
        $this->cloned = true;
    }

}

$obj1 = new Cat();
var_dump($obj1->cloned);

$obj2 = clone $obj1;
var_dump($obj1->cloned);
var_dump($obj2->cloned);

Результат выполнения:

bool(false) bool(false) bool(true)

 

Также имеются магические методы __setState() и __debugInfo(). Первый вызывается во время вызова функции var_export(), а второй во время вызова var_dump(). На примерах рассматривать их не будем, т.к. они используются довольно редко.


Источники:

http://php.net/manual/ru/language.oop5.magic.php