Sobes.tech
Junior

Кои магически методи на класове знаете?

sobes.tech AI

Отговор от AI

Магическите методи в PHP са специални методи, които се извикват автоматично при определени събития. Те започват с __ (двойно подчертаване).

Основните магически методи:

  • __construct(): Извиква се при създаване на нов екземпляр на класа. Използва се за инициализация на обекта.
  • __destruct(): Извиква се при изтриване на обекта или приключване на скрипта. Използва се за освобождаване на ресурси.
  • __call(string $name, array $arguments): Извиква се при опит да се извика недостъпна или несъществуваща метода.
  • __callStatic(string $name, array $arguments): Извиква се при опит да се извика недостъпна или несъществуваща статична метода.
  • __get(string $name): Извиква се при опит да се получи достъп до недостъпна или несъществуваща собственост.
  • __set(string $name, mixed $value): Извиква се при опит да се зададе стойност на недостъпна или несъществуваща собственост.
  • __isset(string $name): Извиква се при извикване на isset() или empty() върху недостъпна или несъществуваща собственост.
  • __unset(string $name): Извиква се при извикване на unset() върху недостъпна или несъществуваща собственост.
  • __serialize(): Извиква се преди сериализация на обекта с serialize(). Връща масив със свойства за сериализация.
  • __unserialize(array $data): Извиква се при десериализация на обекта с unserialize(). Получава масив с данни за възстановяване на свойствата.
  • __toString(): Позволява да разглеждате обекта като низ. Извиква се при опит да се изведе обект като низ (например с echo). Трябва да връща низ.
  • __invoke(...$arguments): Позволява обработка на обекта като функция. Извиква се при опит да се извика обект като функция.
  • __set_state(array $properties): Извиква се при възстановяване на обекта с var_export(). Получава масив със свойства на обекта.
  • __debugInfo(): Извиква се при var_dump() върху обекта. Трябва да връща масив с информация за отстраняване на грешки.

Пример за използване на __construct и __toString:

<?php
class MyClass {
    private $name;

    public function __construct(string $name) {
        $this->name = $name;
    }

    public function __toString(): string {
        return "Обект с име: " . $this->name;
    }
}

$obj = new MyClass("Тест");
echo $obj; // Ще извика __toString()

Пример за използване на __get и __set:

<?php
class MyClass {
    private $data = [];

    public function __set(string $name, mixed $value): void {
        $this->data[$name] = $value;
    }

    public function __get(string $name): mixed {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null; // Или хвърлете изключение
    }
}

$obj = new MyClass();
$obj->prop1 = "Стойност 1"; // Ще извика __set()
echo $obj->prop1; // Ще извика __get()