__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke() , __set_state() und __clone() sowie andere Methoden werden in PHP „Magic-Methoden“ genannt. Sie können diese Methodennamen nicht verwenden, wenn Sie Ihre eigenen Klassenmethoden benennen, es sei denn, Sie möchten deren magische Funktionalität nutzen.
PHP reserviert alle Klassenmethoden, die mit __ (zwei Unterstriche) beginnen, als magische Methoden. Daher wird beim Definieren von Klassenmethoden mit Ausnahme der oben genannten magischen Methoden empfohlen, ihnen kein __ voranzustellen.
__sleep() und __wakeup()
publicarray__sleep ( void )
void__wakeup ( void )
Die Funktion serialize( ) überprüft die Klasse Gibt es eine magische Methode __sleep()? Falls vorhanden, wird diese Methode zuerst aufgerufen und dann der Serialisierungsvorgang ausgeführt. Diese Funktion kann verwendet werden, um ein Objekt zu bereinigen und ein Array zurückzugeben, das die Namen aller Variablen im Objekt enthält, die serialisiert werden sollen. Wenn die Methode nichts zurückgibt, wird NULL serialisiert und ein Fehler auf E_NOTICE-Ebene generiert.
Hinweis:
__sleep() kann den Namen des privaten Mitglieds der übergeordneten Klasse nicht zurückgeben. Dadurch wird ein Fehler der Ebene E_NOTICE generiert. Sie können stattdessen die Serializable-Schnittstelle verwenden.
Die Methode __sleep() wird oft verwendet, um nicht festgeschriebene Daten oder ähnliche Bereinigungsvorgänge zu übermitteln. Gleichzeitig ist diese Funktion nützlich, wenn Sie über einige große Objekte verfügen, diese aber nicht alle speichern müssen.
Im Gegensatz dazu prüft unserialize(), ob es eine __wakeup()-Methode gibt. Falls vorhanden, wird zuerst die Methode __wakeup aufgerufen, um die vom Objekt benötigten Ressourcen im Voraus vorzubereiten.
__wakeup() wird häufig bei Deserialisierungsvorgängen verwendet, z. B. beim Wiederherstellen einer Datenbankverbindung oder beim Durchführen anderer Initialisierungsvorgänge.
Beispiel #1 Schlafen und Aufwachen
class Connection { protected $link; private $server,$username,$password,$db; public function __construct($server,$username,$password,$db) { $this->server = $server; $this->username = $username; $this->password = $password; $this -> db = $db; $this -> connect(); } private function connect(){ $this -> link = mysql_connect($this->server,$this->username,$this->password); mysql_select_db($this->db,$this->link); } public function __sleep(){ return array('server','username','password','db'); } public function __wakeup(){ $this->connect(); } }
__toString()
öffentliche Zeichenfolge __toString (void)
Die Methode __toString() wird für a verwendet Klasse Wie reagiert man, wenn sie als Zeichenfolge behandelt wird? Beispielsweise sollte echo $obj; etwas anzeigen. Diese Methode muss eine Zeichenfolge zurückgeben, andernfalls wird ein schwerwiegender Fehler der Stufe E_RECOVERABLE_ERROR ausgegeben.
Sie können in der __toString()-Methode keine Ausnahmen auslösen, da dies zu einem schwerwiegenden Fehler führt.
Beispiel Nr. 2 Einfaches Beispiel
class TestClass { public $foo; public function __construct($foo) { $this->foo = $foo; } public function __toString(){ return $this->foo; } } $class = new TestClass('Hello'); echo $class;
Ausgabeergebnis:
Hello
Es sollte darauf hingewiesen werden, dass vor PHP 5.2.0 die Methode __toString() vorhanden war nur direkt verwendet. Es wird nur wirksam, wenn es mit echo oder print verwendet wird. Nach PHP 5.2.0 kann es in jeder String-Umgebung verwendet werden (z. B. über printf() mit dem Modifikator %s), kann jedoch nicht in Nicht-String-Umgebungen verwendet werden (z. B. mit dem Modifikator %d). Ab PHP 5.2.0 führt die Konvertierung eines Objekts, das die Methode __toString() nicht definiert, in einen String zu einem Fehler der Ebene E_RECOVERABLE_ERROR.
__invoke()
mixed__invoke ([ $... ] )
Wenn Sie versuchen, ein Objekt durch Aufrufen einer Funktion aufzurufen, wird die Methode __invoke() dies tun wird automatisch aufgerufen.
Hinweis:
Diese Funktion ist nur in PHP 5.3.0 und höher verfügbar.
Beispiel #3 Verwenden Sie __invoke()
class CallableClass { function __invoke($x){ var_dump($x); } } $obj = new CallableClass; $obj(5); var_dump(is_callable($obj));
, um das Ergebnis auszugeben:
int(5)
bool(true)
__set_state()
statisches Objekt __set_state (array $properties)
Seit PHP 5.1.0 wird diese statische Methode aufgerufen, wenn var_export() aufgerufen wird, um eine Klasse zu exportieren.
Der einzige Parameter dieser Methode ist ein Array, das Klasseneigenschaften enthält, die im Format array('property' => value, ...) angeordnet sind.
Beispiel Nr. 4 mit __set_state()> (ab PHP 5.1.0)
class A { public $var1; public $var2; public static function __set_state($an_array) { $obj = new A; $obj -> var1 = $an_array['var1']; $obj -> var2 = $an_array['var2']; return $obj; } } $a = new A; $a->var1 = 5; $a->var2 = 'foo'; eval('$b='.var_export($a,true).';'); var_dump($b);
Ausgabeergebnis:
object(A)#2 (2) { ["var1"]=> int(5) ["var2"]=> string(3) "foo" }