Welke magische methoden bestaan er in PHP en hoe worden ze gebruikt?
sobes.tech AI
Antwoord van AI
Magische methoden in PHP zijn speciale methoden die beginnen met dubbele onderstreping (bijvoorbeeld __construct), die automatisch worden aangeroepen in bepaalde situaties.
De belangrijkste magische methoden en hun gebruik:
-
__construct(): Wordt aangeroepen bij het maken van een object van een klasse. Gebruikt voor het initialiseren van objecteigenschappen en het uitvoeren van eerste acties.<?php class MyClass { public function __construct() { echo "Object gemaakt!"; } } $obj = new MyClass(); // Zal "Object gemaakt!" tonen -
__destruct(): Wordt aangeroepen bij het vernietigen van een object (bijvoorbeeld wanneer het script eindigt of het object uit het geheugen wordt verwijderd). Gebruikt voor het vrijmaken van bronnen (sluiten van bestanden, verbindingen met databases).<?php class MyClass { public function __destruct() { echo "Object vernietigd!"; } } $obj = new MyClass(); unset($obj); // Zal "Object vernietigd!" tonen -
__call(string $name, array $arguments): Wordt aangeroepen bij het proberen aanroepen van een niet-beschikbare of niet-bestaande methode in de context van een object.$namebevat de naam van de methode,$argumentsis een array van argumenten.<?php class MyClass { public function __call($name, $arguments) { echo "Niet-beschikbare methode '{$name}' aangeroepen met argumenten: " . implode(', ', $arguments); } } $obj = new MyClass(); $obj->nonExistentMethod('arg1', 'arg2'); // Zal "Niet-beschikbare methode 'nonExistentMethod' aangeroepen met argumenten: arg1, arg2" tonen -
__callStatic(string $name, array $arguments): Wordt aangeroepen bij het proberen aanroepen van een niet-beschikbare of niet-bestaande statische methode in de context van een klasse. Vergelijkbaar met__call, maar voor statische aanroepen.<?php class MyClass { public static function __callStatic($name, $arguments) { echo "Niet-beschikbare statische methode '{$name}' aangeroepen met argumenten: " . implode(', ', $arguments); } } MyClass::nonExistentStaticMethod('static_arg'); // Zal "Niet-beschikbare statische methode 'nonExistentStaticMethod' aangeroepen met argumenten: static_arg" tonen -
__get(string $name): Wordt aangeroepen bij het proberen opvragen van een niet-beschikbare of niet-bestaande eigenschap in de context van een object.$namebevat de naam van de eigenschap.<?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; // Zal "value" tonen echo $obj->nonExistentKey; // Zal een lege string tonen (afhankelijk van de geretourneerde waarde null) -
__set(string $name, mixed $value): Wordt aangeroepen bij het proberen een waarde in te stellen voor een niet-beschikbare of niet-bestaande eigenschap in de context van een object.$namebevat de naam van de eigenschap,$valueis de toe te wijzen waarde.<?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()); // Zal Array ( [newKey] => newValue ) tonen -
__isset(string $name): Wordt aangeroepen bij het gebruik vanisset()ofempty()op een niet-beschikbare of niet-bestaande eigenschap in de context van een object. Geeft een boolean terug.<?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)); // Zal bool(true) tonen var_dump(isset($obj->absent)); // Zal bool(false) tonen -
__unset(string $name): Wordt aangeroepen bij het gebruik vanunset()op een niet-beschikbare of niet-bestaande eigenschap in de context van een object.<?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 "Eigenschap '{$name}' verwijderd.\n"; } } public function getData() { return $this->data; } } $obj = new MyClass(); print_r($obj->getData()); unset($obj->remove_me); // Zal "Eigenschap 'remove_me' verwijderd." tonen en het element uit $data verwijderen print_r($obj->getData()); -
__sleep(): Wordt aangeroepen vóór serialisatie van het object metserialize(). Moet een array van eigenschapsnamen retourneren die geserialiseerd moeten worden.<?php class MyClass { public $prop1 = 'value1'; public $prop2 = 'value2'; public function __sleep() { return ['prop1']; // Alleen prop1 serialiseren } } $obj = new MyClass(); $serialized = serialize($obj); // Zal alleen prop1 serialiseren echo $serialized; // Zal ongeveer tonen O:7:"MyClass":1:{s:5:"prop1";s:6:"value1";} -
__wakeup(): Wordt aangeroepen na deserialisatie van het object metunserialize(). Gebruikt voor het herstellen van verbindingen met databases of andere acties die nodig zijn na het herstellen van het object.<?php class MyClass { public $prop1; public $resource; // Stel dat dit een resource van een verbinding is public function __wakeup() { // Resource herstellen, bijvoorbeeld een databaseverbinding $this->resource = fopen('/tmp/my_file.txt', 'w'); // Voorbeeld echo "Object gewekt en resource hersteld!\n"; } public function __sleep() { // In __sleep serialiseren we geen resource return ['prop1']; } public function __destruct() { if (is_resource($this->resource)) { fclose($this->resource); echo "Resource gesloten.\n"; } } } $obj = new MyClass(); $obj->prop1 = 'deserialized value'; $serialized = serialize($obj); unset($obj); $deserialized_obj = unserialize($serialized); // Roept __wakeup() aan var_dump($deserialized_obj->prop1); -
__toString(): Wordt aangeroepen wanneer het object als string wordt gebruikt (bijvoorbeeld bijechoof concatenatie). Moet een stringrepresentatie van het object retourneren.<?php class MyClass { public $name = "MyObject"; public function __toString() { return "Object van type MyClass met naam: " . $this->name; } } $obj = new MyClass(); echo $obj; // Zal "Object van type MyClass met naam: MyObject" tonen -
__invoke(...): Wordt aangeroepen bij het proberen het object als functie aan te roepen. Kan elk aantal argumenten accepteren.<?php class MyCallableClass { public function __invoke(...$args) { echo "Object werd aangeroepen als functie met argumenten: " . implode(', ', $args); } } $obj = new MyCallableClass(); $obj('arg1', 123); // Zal "Object werd aangeroepen als functie met argumenten: arg1, 123" tonen -
__set_state(array $properties): Wordt statisch aangeroepen voor klassen geëxporteerd metvar_export(). Ontvangt een array van geëxporteerde eigenschappen. Moet een nieuw object van de klasse maken en teruggeven.<?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); // Exporteert het object // $exported bevat code die een object herstelt, gebruikmakend van __set_state() eval('$restored_obj = ' . $exported . ';'); var_dump($restored_obj); // Zal het MyClass-object tonen met de eigenschap 'exported value' -
__debugInfo(): Wordt aangeroepen bij het gebruik van functies zoalsvar_dump()op het object. De methode moet een array retourneren met informatie over de eigenschappen die getoond moeten worden.<?php class MyClass { public $publicProp = 'public'; private $privateProp = 'private'; public function __debugInfo() { return ['publicProp' => $this->publicProp, 'private_info' => 'enkele details over privateProp']; } } $obj = new MyClass(); var_dump($obj); // Zal de informatie tonen die __debugInfo() retourneert -
__clone(): Wordt aangeroepen na het klonen (clone) van een object. Wordt gebruikt voor diepe kopieën van interne objecten of datastructuren.<?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() { // Diepe kopie van de geneste objecten $this->object = clone $this->object; } } $obj = new MyClass(); $cloned_obj = clone $obj; // Nu zijn $obj->object en $cloned_obj->object verschillende instanties van SubObject $cloned_obj->object->value = 'modified'; var_dump($obj->object->value); // Zal "initial" tonen var_dump($cloned_obj->object->value); // Zal "modified" tonen
Tabel met korte beschrijving:
| Methode | Beschrijving | Wordt aangeroepen bij... |
|---|---|---|
__construct() |
Constructor van de klasse. | Bij het maken van een nieuw exemplaar van de klasse. |
__destruct() |
Destructor van de klasse. | Bij het verwijderen van het object of het beëindigen van het script. |
__call() |
Afhandeling van niet-bestaande/niet-toegankelijke methoden van het object. | Bij het proberen aanroepen van een niet-beschikbare of niet-bestaande methode. |
__callStatic() |
Afhandeling van niet-bestaande/niet-toegankelijke statische methoden. | Bij het proberen aanroepen van een niet-beschikbare of niet-bestaande statische methode. |
__get() |
Afhandeling van het opvragen van niet-beschikbare/niet-bestaande eigenschappen. | Bij het opvragen van een niet-beschikbare of niet-bestaande eigenschap. |
__set() |
Afhandeling van het instellen van niet-beschikbare/niet-bestaande eigenschappen. | Bij het instellen van een niet-beschikbare of niet-bestaande eigenschap. |
__isset() |
Afhandeling van isset() of empty() voor eigenschappen. |
Bij het gebruik van isset() of empty() op een niet-beschikbare of niet-bestaande eigenschap. |
__unset() |
Afhandeling van unset() voor eigenschappen. |
Bij het gebruik van unset() op een niet-beschikbare of niet-bestaande eigenschap. |
__sleep() |
Voorbereiding op serialisatie. | Bij het aanroepen van serialize() voor het object. |
__wakeup() |
Post-verwerking na deserialisatie. | Bij het aanroepen van unserialize() voor het object. |
__toString() |
Stringrepresentatie van het object. | Bij gebruik van het object als string (bijvoorbeeld bij echo). |
__invoke() |
Aanroep van het object als functie. | Bij het proberen aanroepen van het object als functie. |
__set_state() |
Aanmaken van een object na export met var_export(). |
Bij het evalueren van code die is geëxporteerd met var_export(). |
__debugInfo() |
Informatie voor debug-functies (var_dump()). |
Bij het aanroepen van var_dump() voor het object. |
__clone() |
Post-klonering verwerking. | Bij het aanroepen van clone voor het object. |