Sobes.tech
Junior

Jaké magické metody tříd znáte?

sobes.tech AI

Odpověď od AI

Magické metody v PHP jsou speciální metody, které jsou volány automaticky při určitých událostech. Začínají s __ (dvojitá podtržítka).

Hlavní magické metody:

  • __construct(): Volá se při vytváření nové instance třídy. Používá se k inicializaci objektu.
  • __destruct(): Volá se při odstranění objektu nebo ukončení skriptu. Používá se k uvolnění zdrojů.
  • __call(string $name, array $arguments): Volá se při pokusu zavolat nedostupnou nebo neexistující metodu.
  • __callStatic(string $name, array $arguments): Volá se při pokusu zavolat nedostupnou nebo neexistující statickou metodu.
  • __get(string $name): Volá se při pokusu získat přístup k nedostupné nebo neexistující vlastnosti.
  • __set(string $name, mixed $value): Volá se při pokusu nastavit hodnotu nedostupné nebo neexistující vlastnosti.
  • __isset(string $name): Volá se při volání isset() nebo empty() na nedostupné nebo neexistující vlastnosti.
  • __unset(string $name): Volá se při volání unset() na nedostupné nebo neexistující vlastnosti.
  • __serialize(): Volá se před serializací objektu pomocí serialize(). Vrací pole vlastností k serializaci.
  • __unserialize(array $data): Volá se při deserializaci objektu pomocí unserialize(). Obdrží pole dat pro obnovení vlastností.
  • __toString(): Umožňuje považovat objekt za řetězec. Volá se při pokusu vypisovat objekt jako řetězec (například pomocí echo). Musí vracet řetězec.
  • __invoke(...$arguments): Umožňuje zpracovávat objekt jako funkci. Volá se při pokusu zavolat objekt jako funkci.
  • __set_state(array $properties): Volá se při obnovení objektu funkcí var_export(). Obdrží pole vlastností objektu.
  • __debugInfo(): Volá se při volání var_dump() na objektu. Musí vracet pole s informacemi pro ladění.

Příklad použití __construct a __toString:

<?php
class MyClass {
    private $name;

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

    public function __toString(): string {
        return "Objekt s názvem: " . $this->name;
    }
}

$obj = new MyClass("Test");
echo $obj; // Zavolá __toString()

Příklad použití __get a __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; // Nebo vyhodit výjimku
    }
}

$obj = new MyClass();
$obj->prop1 = "Hodnota 1"; // Zavolá __set()
echo $obj->prop1; // Zavolá __get()