📘 Глава 23. Traits и магические методы в PHP
🧩 Что такое Trait?
Trait — это набор методов, который можно включить в любой класс. Это позволяет избежать дублирования кода, особенно если вы не можете или не хотите использовать наследование.
🧪 Пример:
trait Logger {
public function log(string $message): void {
echo "[LOG]: $message" . PHP_EOL;
}
}
class Order {
use Logger;
public function create() {
$this->log("Order created");
}
}
$order = new Order();
$order->create(); // [LOG]: Order created
-
Trait подключается через
use
-
Можно использовать несколько trait-ов
⚠️ Конфликты имен в trait-ах
Если два trait-а имеют метод с одинаковым именем, можно выбрать нужный:
trait A {
public function say() {
echo "A";
}
}
trait B {
public function say() {
echo "B";
}
}
class Example {
use A, B {
B::say insteadof A;
A::say as sayA;
}
}
💡 Когда использовать Traits?
-
Логирование
-
Кэширование
-
Повторяющаяся логика (валидаторы, сериализация и т.п.)
-
Когда неуместно наследование, но нужен повторный код
🧙♂️ Магические методы PHP
Магические методы начинаются с двойного подчёркивания __
и вызываются автоматически при определённых действиях.
🔸 __construct
и __destruct
-
__construct()
— вызывается при создании объекта -
__destruct()
— при удалении объекта (или завершении скрипта)
class Test {
public function __construct() {
echo "Создан";
}
public function __destruct() {
echo "Удалён";
}
}
🔸 __get
и __set
Вызываются при доступе к несуществующим или приватным свойствам:
class Magic {
private array $data = [];
public function __get($name) {
return $this->data[$name] ?? null;
}
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$obj = new Magic();
$obj->title = "Hello";
echo $obj->title; // Hello
🔸 __call
и __callStatic
-
__call($name, $args)
— если вызван неопределённый метод -
__callStatic($name, $args)
— то же, но статический
class Magic {
public function __call($name, $args) {
echo "Вызван метод $name с аргументами: " . implode(", ", $args);
}
}
$obj = new Magic();
$obj->foo("bar", 42);
🔸 __toString
Определяет поведение при echo $object
:
class Product {
public function __toString(): string {
return "Product object";
}
}
echo new Product(); // Product object
🔸 __isset
, __unset
, __sleep
, __wakeup
, __invoke
, __clone
, __debugInfo
и др.
Есть ещё:
-
__isset
/__unset
— приisset()
илиunset()
-
__invoke
— если объект вызывается как функция:$obj()
-
__clone
— приclone
-
__debugInfo
— влияет наvar_dump()
✅ Что ты усвоил:
-
Что такое
trait
, как они помогают повторно использовать код -
Как обрабатывать свойства и методы через магические методы
-
Что происходит «под капотом» при вызове
echo $object
,$obj()
и др.
⏭ В следующей главе:
Поговорим про обработку ошибок и исключения (try/catch), а также создание собственных исключений — как правильно работать с ошибками в современном PHP.