In PHP werden Methoden, die mit zwei Unterstrichen __ beginnen, als magische Methoden bezeichnet. Diese Methoden spielen in PHP eine entscheidende Rolle. Zu den magischen Methoden gehören:
__construct(), Klassenkonstruktor
__destruct(), Klassendestruktor
__call(), Aufruf eines unzugänglichen Objekts im Objekt. Rufen Sie
__callStatic() beim Aufrufen einer Methode, Aufruf __get() beim Aufrufen einer unzugänglichen Methode im statischen Modus, Aufruf __set() beim Abrufen einer Mitgliedsvariablen einer Klasse), Aufruf __isset() beim Festlegen von Mitgliedsvariablen einer Klasse, Aufruf von isset() oder empty() beim Aufrufen unzugänglicher Eigenschaften, Aufruf __unset() beim Aufrufen unzugänglicher Eigenschaften. Wird aufgerufen, wenn unset() ist angerufen. __sleep(), wenn serialize() ausgeführt wird, wird diese Funktion zuerst aufgerufen __wakeup(), wenn unserialize() ausgeführt wird, diese Funktion __toString( ), die Antwortmethode, wenn die Klasse als Zeichenfolge behandelt wird __invoke(), die Antwortmethode, wenn ein Objekt durch Aufrufen einer Funktion aufgerufen wird __set_state(), wenn var_export() aufgerufen wird Exportieren Sie eine Klasse. Diese statische Methode wird aufgerufen. __clone(), wird aufgerufen, wenn die Objektkopie abgeschlossen ist<?php class FileRead { protected $handle = NULL; function __construct(){ $this->handle = fopen(...); } function __destruct(){ fclose($this->handle); } } ?>
<?php class TmpFileRead extends FileRead { function __construct(){ parent::__construct(); } function __destruct(){ parent::__destruct(); } } ?>
<?php class MethodTest { public function __call ($name, $arguments) { echo "Calling object method '$name' ". implode(', ', $arguments). "\n"; } public static function __callStatic ($name, $arguments) { echo "Calling static method '$name' ". implode(', ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); ?>
<?php class MethodTest { private $data = array(); public function __set($name, $value){ $this->data[$name] = $value; } public function __get($name){ if(array_key_exists($name, $this->data)) return $this->data[$name]; return NULL; } public function __isset($name){ return isset($this->data[$name]) } public function unset($name){ unset($this->data[$name]); } } ?>
<?php 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(); } } ?>
<?php // Declare a simple class class TestClass { public function __toString() { return 'this is a object'; } } $class = new TestClass(); echo $class; ?>
<?php class CallableClass { function __invoke() { echo 'this is a object'; } } $obj = new CallableClass; var_dump(is_callable($obj)); ?>
<?php 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'; var_dump(var_export($a)); ?>
<?php public class Singleton { private static $_instance = NULL; // 私有构造方法 private function __construct() {} public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new Singleton(); } return self::$_instance; } // 防止克隆实例 public function __clone(){ die('Clone is not allowed.' . E_USER_ERROR); } } ?>
__FUNCTION__, Funktionsname __CLASS__, Klassenname __TRAIT__, Merkmalsname __METHOD__, Klassenmethodenname __NAMESPACE__, Name des aktuellen Namespace