Sobes.tech
Junior

Čo sú magické metódy v PHP?

sobes.tech AI

Odpoveď od AI

Magické metódy v PHP sú špeciálne metódy, ktoré sa automaticky volajú za určitých okolností. Ich mená začínajú dvomi podčiarknutými znakmi (__).

Zoznam hlavných magických metód:

  • __construct(): Volá sa pri vytvorení nového objektu.
  • __destruct(): Volá sa pri zničení objektu.
  • __call($name, $arguments): Volá sa pri pokuse volať nedostupnú alebo neexistujúcu metódu objektu.
  • __callStatic($name, $arguments): Volá sa pri pokuse volať nedostupnú alebo neexistujúcu statickú metódu.
  • __get($name): Volá sa pri pokuse získať hodnotu nedostupného vlastnosti objektu.
  • __set($name, $value): Volá sa pri pokuse nastaviť hodnotu nedostupného vlastnosti objektu.
  • __isset($name): Volá sa pri použití isset() alebo empty() na nedostupnej vlastnosti.
  • __unset($name): Volá sa pri použití unset() na nedostupnej vlastnosti.
  • __sleep(): Volá sa pred serializáciou, vracia pole mien vlastností na serializáciu.
  • __wakeup(): Volá sa po deserializácii.
  • __toString(): Umožňuje objektu správať sa ako reťazec pri použití v reťazcovom kontexte.
  • __invoke($args): Volá sa, keď skript sa pokúša volať objekt ako funkciu.
  • __set_state(array $properties): Volá sa pri exporte objektu funkciou var_export().
  • __clone(): Volá sa po dokončení klonovania objektu na nastavenie klona.
  • __serialize(): Volá sa počas serializácie, vracia pole dát na serializáciu.
  • __unserialize(array $data): Volá sa počas deserializácie, získava dáta z __serialize().

Príklad použitia __construct a __destruct:

<?php
class Example {
    public function __construct() {
        echo "Objekt vytvorený\n";
    }

    public function __destruct() {
        echo "Objekt zničený\n";
    }
}

$obj = new Example();
unset($obj); // Nútené zničenie objektu
?>

Príklad použitia __get a __set:

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

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

    public function __get($name) {
        if (array_key_exists($name, $this->data)) {
            return $this->data[$name];
        }
        return null; // Alebo vyhodenie výnimky
    }
}

$store = new DataStore();
$store->name = "Alice"; // Volá __set
echo $store->name; // Volá __get
?>