Jaké magické metody existují v PHP a jak se používají?
sobes.tech AI
Odpověď od AI
V PHP jsou magické metody speciální metody, které začínají dvojitým podtržítkem (například __construct) a jsou automaticky volány za určitých okolností.
Hlavní magické metody a jejich použití:
-
__construct(): Volá se při vytváření instance třídy. Používá se k inicializaci vlastností objektu a provádění počátečních akcí.<?php class MyClass { public function __construct() { echo "Objekt byl vytvořen!"; } } $obj = new MyClass(); // Vypíše "Objekt byl vytvořen!" -
__destruct(): Volá se při zničení objektu (například když skript končí nebo je objekt odstraněn z paměti). Používá se k uvolnění zdrojů (zavření souborů, ukončení spojení s databází).<?php class MyClass { public function __destruct() { echo "Objekt byl zničen!"; } } $obj = new MyClass(); unset($obj); // Vypíše "Objekt byl zničen!" -
__call(string $name, array $arguments): Volá se při pokusu zavolat nedostupnou nebo neexistující metodu v kontextu objektu.$nameobsahuje název metody a$argumentspole argumentů.<?php class MyClass { public function __call($name, $arguments) { echo "Volána nedostupná metoda '{$name}' s argumenty: " . implode(', ', $arguments); } } $obj = new MyClass(); $obj->nonExistentMethod('arg1', 'arg2'); // Vypíše "Volána nedostupná metoda 'nonExistentMethod' s argumenty: arg1, arg2" -
__callStatic(string $name, array $arguments): Volá se při pokusu zavolat nedostupnou nebo neexistující statickou metodu v kontextu třídy. Podobně jako__call, ale pro statické volání.<?php class MyClass { public static function __callStatic($name, $arguments) { echo "Volána nedostupná statická metoda '{$name}' s argumenty: " . implode(', ', $arguments); } } MyClass::nonExistentStaticMethod('static_arg'); // Vypíše "Volána nedostupná statická metoda 'nonExistentStaticMethod' s argumenty: static_arg" -
__get(string $name): Volá se při pokusu získat hodnotu nedostupného nebo neexistujícího vlastnosti v kontextu objektu.$nameobsahuje název vlastnosti.<?php class MyClass { private $data = ['key' => 'value']; public function __get($name) { if (array_key_exists($name, $this->data)) { return $this->data[$name]; } return null; } } $obj = new MyClass(); echo $obj->key; // Vypíše "value" echo $obj->nonExistentKey; // Vypíše prázdný řetězec (v závislosti na návratové hodnotě null) -
__set(string $name, mixed $value): Volá se při pokusu nastavit hodnotu nedostupné nebo neexistující vlastnosti v kontextu objektu.$nameobsahuje název vlastnosti a$valuenastavovanou hodnotu.<?php class MyClass { private $data = []; public function __set($name, $value) { $this->data[$name] = $value; } public function getData() { return $this->data; } } $obj = new MyClass(); $obj->newKey = 'newValue'; print_r($obj->getData()); // Vypíše Array ( [newKey] => newValue ) -
__isset(string $name): Volá se při voláníisset()neboempty()na nedostupné nebo neexistující vlastnosti v kontextu objektu. Vrací boolean hodnotu.<?php class MyClass { private $data = ['present' => 'value']; public function __isset($name) { return array_key_exists($name, $this->data); } } $obj = new MyClass(); var_dump(isset($obj->present)); // bool(true) var_dump(isset($obj->absent)); // bool(false) -
__unset(string $name): Volá se při voláníunset()na nedostupné nebo neexistující vlastnosti v kontextu objektu.<?php class MyClass { private $data = ['remove_me' => 'value_to_remove']; public function __unset($name) { if (array_key_exists($name, $this->data)) { unset($this->data[$name]); echo "Vlastnost '{$name}' byla odstraněna.\n"; } } public function getData() { return $this->data; } } $obj = new MyClass(); print_r($obj->getData()); unset($obj->remove_me); // Vypíše "Vlastnost 'remove_me' byla odstraněna." a odstraní prvek z $data print_r($obj->getData()); -
__sleep(): Volá se před serializací objektu pomocíserialize(). Měl by vrátit pole názvů vlastností, které mají být serializovány.<?php class MyClass { public $prop1 = 'value1'; public $prop2 = 'value2'; public function __sleep() { return ['prop1']; // Serializuje pouze prop1 } } $obj = new MyClass(); $serialized = serialize($obj); // Serializuje pouze prop1 echo $serialized; // Přibližně: O:7:"MyClass":1:{s:5:"prop1";s:6:"value1";} -
__wakeup(): Volá se po deserializaci objektu pomocíunserialize(). Používá se k obnovení spojení s databází nebo jiných akcí potřebných po obnovení objektu.<?php class MyClass { public $prop1; public $resource; // Předpokládejme, že je to zdroj spojení public function __wakeup() { // Obnovení zdroje, například spojení s databází $this->resource = fopen('/tmp/my_file.txt', 'w'); // Příklad echo "Objekt byl probuzen a zdroj obnoven!\n"; } public function __sleep() { // V __sleep ne serializujeme zdroj return ['prop1']; } public function __destruct() { if (is_resource($this->resource)) { fclose($this->resource); echo "Zdroj byl uzavřen.\n"; } } } $obj = new MyClass(); $obj->prop1 = 'deserialized value'; $serialized = serialize($obj); unset($obj); $deserialized_obj = unserialize($serialized); // Zavolá __wakeup() var_dump($deserialized_obj->prop1); -
__toString(): Volá se při použití objektu jako řetězce (například přiechonebo konkatenaci). Měl by vrátit řetězcové zobrazení objektu.<?php class MyClass { public $name = "MyObject"; public function __toString() { return "Objekt typu MyClass s názvem: " . $this->name; } } $obj = new MyClass(); echo $obj; // Vypíše "Objekt typu MyClass s názvem: MyObject" -
__invoke(...): Volá se při pokusu zavolat objekt jako funkci. Může přijímat libovolný počet argumentů.<?php class MyCallableClass { public function __invoke(...$args) { echo "Objekt byl volán jako funkce s argumenty: " . implode(', ', $args); } } $obj = new MyCallableClass(); $obj('arg1', 123); // Vypíše "Objekt byl volán jako funkce s argumenty: arg1, 123" -
__set_state(array $properties): Statický volání při exportu třídy pomocívar_export(). Přijímá pole exportovaných vlastností. Měl by vytvořit nový objekt třídy a vrátit jej.<?php class MyClass { public $prop; public static function __set_state(array $properties) { $obj = new MyClass(); $obj->prop = $properties['prop']; return $obj; } } $obj = new MyClass(); $obj->prop = 'exported value'; $exported = var_export($obj, true); // Exportuje objekt // $exported bude obsahovat kód pro vytvoření objektu, který používá __set_state() eval('$restored_obj = ' . $exported . ';'); var_dump($restored_obj); // Vypíše objekt MyClass s vlastností 'exported value' -
__debugInfo(): Volá se při volání funkcí typuvar_dump()na objektu. Metoda by měla vracet pole s informacemi o vlastnostech objektu, které mají být zobrazeny.<?php class MyClass { public $publicProp = 'public'; private $privateProp = 'private'; public function __debugInfo() { return ['publicProp' => $this->publicProp, 'private_info' => 'některé detaily o privateProp']; } } $obj = new MyClass(); var_dump($obj); // Zobrazí informace vrácené __debugInfo() -
__clone(): Volá se po operaci klonování (clone) objektu. Používá se k hlubokému kopírování vnitřních objektů nebo datových struktur.<?php class SubObject { public $value; public function __construct($value) { $this->value = $value; } } class MyClass { public $object; public $anotherProp; public function __construct() { $this->object = new SubObject('initial'); $this->anotherProp = 'original'; } public function __clone() { // Klonování vnořeného objektu pro hlubokou kopii $this->object = clone $this->object; } } $obj = new MyClass(); $cloned_obj = clone $obj; // Nyní $obj->object a $cloned_obj->object jsou různé instance SubObject $cloned_obj->object->value = 'modified'; var_dump($obj->object->value); // Vypíše "initial" var_dump($cloned_obj->object->value); // Vypíše "modified"
| Metoda | Popis | Volá se při... |
|---|---|---|
__construct() |
Konstruktor třídy. | Vytvoření nové instance třídy. |
__destruct() |
Destruktor třídy. | Při odstranění objektu nebo ukončení skriptu. |
__call() |
Zpracování volání nedostupných/neexistujících metod objektu. | Při pokusu o volání nedostupné nebo neexistující metody objektu. |
__callStatic() |
Zpracování volání nedostupných/neexistujících statických metod. | Při pokusu o volání nedostupné nebo neexistující statické metody třídy. |
__get() |
Zpracování získání hodnoty nedostupného/neexistujícího vlastnosti. | Při pokusu o získání hodnoty nedostupného nebo neexistujícího vlastnosti objektu. |
__set() |
Zpracování nastavení hodnoty nedostupné/neexistující vlastnosti. | Při pokusu o nastavení hodnoty nedostupného nebo neexistujícího vlastnosti objektu. |
__isset() |
Zpracování isset() nebo empty() pro vlastnosti. |
Při volání isset() nebo empty() na nedostupném nebo neexistujícím vlastnosti objektu. |
__unset() |
Zpracování unset() pro vlastnosti. |
Při volání unset() na nedostupném nebo neexistujícím vlastnosti objektu. |
__sleep() |
Příprava na serializaci. | Při volání serialize() na objektu. |
__wakeup() |
Po deserializaci. | Při volání unserialize() na objektu. |
__toString() |
Řetězcové zobrazení objektu. | Při použití objektu jako řetězce (například při echo). |
__invoke() |
Volání objektu jako funkce. | Při pokusu o volání objektu jako funkce. |
__set_state() |
Vytvoření objektu po exportu s var_export(). |
Při vyhodnocení kódu vytvořeného var_export(). |
__debugInfo() |
Informace pro ladicí funkce (var_dump()). |
Při volání var_dump() na objektu. |
__clone() |
Po klonování. | Při volání clone na objektu. |