Магические методы PHP
28 сентября 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(). На примерах рассматривать их не будем, т.к. они используются довольно редко.