1. __construct() und __destruct()
werden aufgerufen, wenn die Instanz erstellt/zerstört wird, und können 0 oder mehr Parameter übergeben.
class A { function A() { echo "build A"; } function __destruct() { echo "destroy A"; } } $obj = new A(); //unset($obj);
Hinweis: Die Destruktormethode wird aufgerufen, sobald keine anderen Verweise auf ein bestimmtes Objekt vorhanden sind, oder in beliebiger Reihenfolge während der Abschaltsequenz .
In Bezug auf Konstruktoren gilt ab PHP 5.3.3 eine Methode, die mit dem Klassennamen in einer in einem bestimmten Namespace definierten Klasse benannt ist, nicht mehr als Konstruktor. In einer Klasse ohne Namespace handelt es sich weiterhin um einen Konstruktor wie zuvor. Zum Beispiel:
namespace Foo; class Bar { public function Bar() { // treated as constructor in PHP 5.3.0-5.3.2 // treated as regular method as of PHP 5.3.3 } }
Wenn kein Namespace Foo vorhanden ist, wird auch Bar() als Konstruktor verwendet. Wenn außerdem die folgende Situation vorliegt:
function __construct() { echo "construct A"; } function A() { echo "build A"; } function __destruct() { echo "destroy A"; } }
Das heißt, es enthält sowohl __construct() als auch eine Funktion mit demselben Namen wie der Klassenname , dann wird nur _ _construct() aufgerufen.
2. __call() und __callStatic()
Wird aufgerufen, wenn versucht wird, eine Methode aufzurufen, die nicht existiert. Zwei Parameter, einer ist der Methodenname und der andere das Parameterarray der aufgerufenen Methode.
class MethodTest { public function __call($name, $arguments) { // Note: value of $name is case sensitive. echo "Calling object method '$name' " . implode(' ', $arguments). "<br>"; } public static function __callStatic($name, $arguments) { // Note: value of $name is case sensitive. echo "Calling static method '$name' " . implode(' ', $arguments). "<br>"; } } $obj = new MethodTest; $obj->runTest('in','object','context'); MethodTest::runTest('in','static','context');
Darunter wird $arguments als Array übergeben. Ergebnisse ausführen:
Aufruf der Objektmethode „runTest“ im Objektkontext
Aufruf der statischen Methode „runTest“ im statischen Kontext
Achten Sie auch auf den Umfang der Funktion protected und private:
class TestMagicCallMethod { public function foo() { echo __METHOD__.PHP_EOL."<br>"; } public function __call($method, $args) { echo __METHOD__.PHP_EOL."<br>"; if(method_exists($this, $method)) { $this->$method(); } } protected function bar() { echo __METHOD__.PHP_EOL."<br>"; } private function baz() { echo __METHOD__.PHP_EOL."<br>"; } } $test = new TestMagicCallMethod(); $test->foo(); /** * Outputs: * TestMagicCallMethod::foo */ $test->bar(); /** * Outputs: * TestMagicCallMethod::__call * TestMagicCallMethod::bar */ $test->baz(); /** * Outputs: * TestMagicCallMethod::__call * TestMagicCallMethod::baz */
3.__get() und __set()
werden aufgerufen, wenn versucht wird, Eigenschaften eines Objekts zu lesen, die nicht vorhanden sind.
Hinweis: Wir können diese Funktion verwenden, um verschiedene Operationen ähnlich der Reflexion in Java zu implementieren.
class Test { public function __get($key) { echo $key . " not exists"; } public function __set($key,$value) { echo $key . " = ".$value; } } $t = new Test(); echo $t->name."<br>"; $t->name = "abc";
Ausgabe:
Name existiert nicht
Name = abc
4. __toString()
Diese Methode ähnelt der toString()-Methode von Java. Wenn wir das Objekt direkt drucken, rufen wir diese Funktion auf.
class Test { private $name = "abc"; private $age = 12; public function __toString() { return "name : $this->name, age : $this->age"; } } $t = new Test(); echo $t;
Ausgabe:
Name: abc, Alter: 12
Weitere magische Methoden in PHP-Klassen (Magic Methode) Eine kurze Zusammenfassung verwandter Artikel finden Sie auf der chinesischen PHP-Website!