Перегрузка в PHP дает возможность динамически «создавать» свойства и методы. Такие методы и свойства обрабатываются с помощью «волшебных» методов, которые можно создать в классе для различных видов действий.
Перегрузка свойств
Обращения к свойствам объекта могут быть перегружены с использованием методов __get
и __set
. Эти методы будут срабатывать в том случае, если объект не содержит свойства, к которому осуществляется доступ. Синтаксис:
<?php
public void __set (string $name , mixed $value)
public mixed __get (string $name)
?>
Пример использования:
<?php
class MyClass {
public $c = "c value";
public function __set($name, $value) {
echo "__set, property - {$name} is not exists \n";
}
public function __get($name) {
echo "__get, property - {$name} is not exists \n";
}
}
$obj = new MyClass;
$obj->a = 1;
echo $obj->b;
echo $obj->c;
?>
Результат:
__set, property - a is not exists
__get, property - b is not exists
c value
Перегрузка методов
Вызовы методов могут быть перегружены с использованием методов __call
. Эти методы будут срабатывать в том случае, если объект не содержит метода, к которому осуществляется доступ. Синтаксис:
<?php
public mixed __call (string $name , array $arguments)
?>
Пример:
<?php
class MyClass {
public function __call($name, $arguments) {
return "__call, method - {$name} is not exists \n";
}
public function getId() {
return "AH-15474";
}
}
$obj = new MyClass;
echo $obj->getName();
echo $obj->getId();
?>
Результат:
__call, method - getName is not exists (при вызове getName)
AH-15474 (при вызове getId)
Магический метод __toString
Метод __toString()
будет срабатывать при попытке преобразования класса в строку. Например, echo $obj;
.
Синтаксис:
<?php
public string __toString ()
?>
Пример:
<?php
class MyClass {
public function __toString() {
return "MyClass class";
}
}
$obj = new MyClass;
echo $obj;
?>
Магический метод __invoke()
Метод __invoke()
вызывается, когда объект пытаются вызвать как функцию.
Синтаксис:
<?php
mixed __invoke ([ $... ] )
?>
Пример:
<?php
class MyClass {
public function __invoke($a) {
return $a;
}
}
$obj = new MyClass;
echo $obj(75);
?>