Статья

📘 Глава 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.

PHP
Для ответа вы можете авторизоваться