Koje magične metode postoje u PHP-u i kako se koriste?
sobes.tech АИ
Одговор од АИ
Магичне методе у PHP-у су посебни методи који почињу са двоструким подчертавањем (на пример, __construct), који се аутоматски позивају у одређеним ситуацијама.
Главни магични методи и њихова употреба:
-
__construct(): Позива се приликом креирања објекта од класе. Користи се за иницијализацију својстава објекта и извођење почетних радњи.<?php class MyClass { public function __construct() { echo "Објекат креиран!"; } } $obj = new MyClass(); // Исписа "Објекат креиран!" -
__destruct(): Позива се приликом уништавања објекта (на пример, када скрипта заврши или објекат буде избрисан). Користи се за ослобађање ресурса (затварање фајлова, веза са базама података).<?php class MyClass { public function __destruct() { echo "Објекат уништен!"; } } $obj = new MyClass(); unset($obj); // Исписа "Објекат уништен!" -
__call(string $name, array $arguments): Позива се приликом покушаја да се позове недоступан или несуществујући метод у контексту објекта.$nameсадржи име метода, а$arguments- низ аргумената.<?php class MyClass { public function __call($name, $arguments) { echo "Позван недоступан метод '{$name}' са аргументима: " . implode(', ', $arguments); } } $obj = new MyClass(); $obj->nonExistentMethod('arg1', 'arg2'); // Исписа "Позван недоступан метод 'nonExistentMethod' са аргументима: arg1, arg2" -
__callStatic(string $name, array $arguments): Позива се приликом покушаја да се позове недоступан или несуществујући статички метод у контексту класе. Аналогичан је на__call, али за статичке позиве.<?php class MyClass { public static function __callStatic($name, $arguments) { echo "Позван недоступан статички метод '{$name}' са аргументима: " . implode(', ', $arguments); } } MyClass::nonExistentStaticMethod('static_arg'); // Исписа "Позван недоступан статички метод 'nonExistentStaticMethod' са аргументима: static_arg" -
__get(string $name): Позива се приликом покушаја добијања вредности недоступног или несуществујућег својства у контексту објекта.$nameсадржи име својства.<?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; // Исписа "value" echo $obj->nonExistentKey; // Исписа празан низ (у зависности од враћене вредности null) -
__set(string $name, mixed $value): Позива се приликом постављања вредности недоступног или несуществујућег својства у контексту објекта.$nameсадржи име својства, а$value- постављена вредност.<?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()); // Исписа Array ( [newKey] => newValue ) -
__isset(string $name): Позива се приликом позиваisset()илиempty()на недоступном или несуществујућем својству у контексту објекта. Враћа булеву вредност.<?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): Позива се приликом позиваunset()на недоступном или несуществујућем својству у контексту објекта.<?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 "Својство '{$name}' је избрисано.\n"; } } public function getData() { return $this->data; } } $obj = new MyClass(); print_r($obj->getData()); unset($obj->remove_me); // Исписа "Својство 'remove_me' је избрисано." и уклања елемент из $data print_r($obj->getData()); -
__sleep(): Позива се пре серијализације објекта коришћењемserialize(). Трба да врати низ имена својстава која треба серијализовати.<?php class MyClass { public $prop1 = 'value1'; public $prop2 = 'value2'; public function __sleep() { return ['prop1']; // Серијализујемо само prop1 } } $obj = new MyClass(); $serialized = serialize($obj); // Серијализује само prop1 echo $serialized; // Исписа отприлике O:7:"MyClass":1:{s:5:"prop1";s:6:"value1";} -
__wakeup(): Позива се након десеријализације објекта коришћењемunserialize(). Користи се за обнову веза са базама података или других радњи потребних након обнове објекта.<?php class MyClass { public $prop1; public $resource; // Предпоставимо да је то ресурс везе public function __wakeup() { // Обнова ресурса, на пример, веза са базом података $this->resource = fopen('/tmp/my_file.txt', 'w'); // Пример echo "Објекат буди и ресурс обновљен!\n"; } public function __sleep() { // У __sleep не серијализујемо ресурс return ['prop1']; } public function __destruct() { if (is_resource($this->resource)) { fclose($this->resource); echo "Ресурс затворен.\n"; } } } $obj = new MyClass(); $obj->prop1 = 'deserialized value'; $serialized = serialize($obj); unset($obj); $deserialized_obj = unserialize($serialized); // Позива __wakeup() var_dump($deserialized_obj->prop1); -
__toString(): Позива се када се објекат користи као низ (на пример, приechoили конкатенацији). Трба да врати низово представљање објекта.<?php class MyClass { public $name = "MyObject"; public function __toString() { return "Објекат типа MyClass са именом: " . $this->name; } } $obj = new MyClass(); echo $obj; // Исписа "Објекат типа MyClass са именом: MyObject" -
__invoke(...): Позива се приликом покушаја позивања објекта као функције. Може примати било који број аргумената.<?php class MyCallableClass { public function __invoke(...$args) { echo "Објекат је позван као функција са аргументима: " . implode(', ', $args); } } $obj = new MyCallableClass(); $obj('arg1', 123); // Исписа "Објекат је позван као функција са аргументима: arg1, 123" -
__set_state(array $properties): Позива се статички за класе које су извозене помоћуvar_export(). Добија низ извозених својстава. Трба да креира нови објекат класе и врати га.<?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); // Експортира објекат // $exported ће садржати код за креирање објекта који користи __set_state() eval('$restored_obj = ' . $exported . ';'); var_dump($restored_obj); // Исписа објекат MyClass са својством 'exported value' -
__debugInfo(): Позива се приликом позива функција типаvar_dump()за објекат. Метод треба да врати низ са информацијама о својствима објекта које треба приказати.<?php class MyClass { public $publicProp = 'public'; private $privateProp = 'private'; public function __debugInfo() { return ['publicProp' => $this->publicProp, 'private_info' => 'неке детаље о privateProp']; } } $obj = new MyClass(); var_dump($obj); // Исписа информације које враћа __debugInfo() -
__clone(): Позива се након операције клонирања (clone) објекта. Користи се за дубоко копирање унутрашњих објеката или структура података.<?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() { // Клонирамо унутрашњи објекат за дубоко копирање $this->object = clone $this->object; } } $obj = new MyClass(); $cloned_obj = clone $obj; // Сада $obj->object и $cloned_obj->object су различити примерци SubObject $cloned_obj->object->value = 'modified'; var_dump($obj->object->value); // Исписа "initial" var_dump($cloned_obj->object->value); // Исписа "modified"
Табела са кратким описом:
| Метод | Опис | Позива се при... |
|---|---|---|
__construct() |
Конструктор класе. | Креирање новог примерка класе. |
__destruct() |
Деструктор класе. | Уклањање објекта или завршетак скрипте. |
__call() |
Обрада позива несуществујућих/недоступних метода објекта. | Покушај позива недоступног или несуществујућег метода објекта. |
__callStatic() |
Обрада позива несуществујућих/недоступних статичких метода. | Покушај позива недоступног или несуществујућег статичког метода. |
__get() |
Обрада добијања вредности недоступног/несуществујућег својства. | Покушај добијања вредности недоступног или несуществујућег својства. |
__set() |
Обрада постављања вредности недоступног/несуществујућег својства. | Покушај постављања вредности недоступног или несуществућег својства. |
__isset() |
Обрада isset() или empty() за својства. |
Вика се при isset() или empty() на недоступном или несуществућем својству. |
__unset() |
Обрада unset() за својства. |
Вика се при unset() на недоступном или несуществућем својству. |
__sleep() |
Припрема за серијализацију. | Вика се при serialize() за објекат. |
__wakeup() |
Постобрада након десеријализације. | Вика се при unserialize() за објекат. |
__toString() |
Строго низово представљање објекта. | Коришћење објекта као низа (на пример, при echo). |
__invoke() |
Објекат као функција. | Покушај позива објекта као функције. |
__set_state() |
Креирање објекта након извозења са var_export(). |
Оцена кода, креирано помоћу var_export(). |
__debugInfo() |
Информације за отварање грешака (var_dump()). |
Вика се при var_dump() за објекат. |
__clone() |
Постклонирање. | Вика се при clone за објекат. |