Heim >Backend-Entwicklung >PHP-Tutorial >magische Methode in PHP
Magische PHP-Methoden:
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(), __isset(), Methoden wie __unset(), __sleep(), __wakeup(), __toString(), __invoke(), __set_state(), __clone() und __debugInfo() 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.
__construct(),类的构造函数 __destruct(),类的析构函数 __call(),在对象中调用一个不可访问方法(私有或者不存在)时调用 __callStatic(),用静态方式中调用一个不可访问方法时调用 __get(),获得一个类的成员变量时调用 __set(),设置一个类的成员变量时调用 __isset(),当对不可访问属性调用isset()或empty()时调用 __unset(),当对不可访问属性调用unset()时被调用。 __sleep(),执行serialize()时,先会调用这个函数 __wakeup(),执行unserialize()时,先会调用这个函数 __toString(),类被当成字符串时的回应方法 __invoke(),调用函数的方式调用一个对象时的回应方法 __set_state(),调用var_export()导出类时,此静态方法会被调用。 __clone(),当对象复制完成时调用
__construct() und __destruct()
Der Konstruktor __construct() wird aufgerufen, wenn das Objekt erstellt wird, und der Destruktor __destruct() wird aufgerufen, wenn das Objekt stirbt 🎜>
<?php   class ConDes {     protected $a = '';     function __construct(){         echo '在构造函数中<br>'; } function __destruct(){ echo '在析构函数中<br>'; } } $val = new ConDes(); unset($val); ?><pre name="code" class="php">Ausgänge: Im Konstruktor und im Destruktor__call() und __callStatic() werden aufgerufen, wenn eine nicht zugängliche Methode im Objekt aufgerufen wird. Letzteres ist eine statische Methode. Ausgabe:
<?php class MethodTest { public function __call ($name, $arguments) { var_dump($arguments); echo "object method $name and ".implode(',',$arguments)."<br>"; } public static function __callStatic ($name, $arguments) { echo "static method $name and ".implode(',',$arguments)."<br>"; } } $obj = new MethodTest; $obj->runTest('in object context','another arg'); MethodTest::runTest('in static context'); ?>Array (Größe=2)
0 => Zeichenfolge „im Objektkontext“ (Länge=17)
1 => Zeichenfolge „anderes Argument“ (Länge=11)
Objektmethode runTest und in Objektkontext, ein weiteres Argument
statische Methode runTest und im statischen Kontext
beim Abrufen eines nicht zugänglichen Klassenmitglieds Diese beiden Funktionen werden aufgerufen beim Festlegen einer unzugänglichen Klassenmitgliedsvariablen. <br><br>
Ausgabe:<?php class MethodTest { private $data = array(); private $a = ''; public $bbb = ''; public function __set($name, $value){ $this->data[$name] = $value; echo '__set'; var_dump($this->data); } public function __get($name){ echo '__get'; var_dump($this->data); if(array_key_exists($name, $this->data)) return $this->data[$name]; return NULL; } public function __isset($name){ echo '__isset'; return isset($this->data[$name]); } public function __unset($name){ echo '__unset'; unset($this->data[$name]); } } $in = new MethodTest(); $in->a = 'aaaa'; $aaa = $in->a; $res = isset($in->c)? 'set':'not set'; echo '<br>'.$res.'<br>'; unset($in->a); ?>__set
array (size=1)
'a' => string 'aaaa' (length=4)
__get
array (size=1)
'a' = > Zeichenfolge 'aaaa' (Länge=4)
__isset
nicht gesetzt
__unset
Wenn wir serialize() und unserialize ausführen () werden diese beiden Funktionen zuerst aufgerufen. Wenn wir beispielsweise ein Objekt serialisieren, verfügt das Objekt über eine Datenbankverknüpfung. Wenn wir den Verknüpfungsstatus während der Deserialisierung wiederherstellen möchten, können wir die Verknüpfung wiederherstellen, indem wir diese beiden Funktionen wiederherstellen.
<p><code><span></span>
<?php class Connection {     public $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() { echo 'sleep<br>'; return array('server', 'username', 'password', 'db'); } public function __wakeup() { echo 'wakeup<br>'; $this->connect(); } } $a = new Connection('localhost','mosi','moshi','test'); $sql = 'select id,username from user limit 1'; $res = mysql_query($sql,$a->link); $res = mysql_fetch_array($res); var_dump($res); $sres = serialize($a); mysql_close($a->link); //unset($a); $unsres = unserialize($sres); var_dump($unsres); $sql = 'select id,username from user limit 1'; $ress = mysql_query($sql,$unsres->link); $ress = mysql_fetch_array($ress); var_dump($ress); ?>Ausgabe:
<code><span>array (size=4)<br> 0 => string '1' (length=1)<br> 'id' => string '1' (length=1)<br> 1 => string 'm0sh1' (length=5)<br> 'username' => string 'm0sh1' (length=5)<br>sleep<br>wakeup<br>object(Connection)[2]<br> public 'link' => resource(6, mysql link)<br> private 'server' => string 'localhost' (length=9)<br> private 'username' => string 'moshi' (length=4)<br> private 'password' => string 'moshi' (length=5)<br> private 'db' => string 'test' (length=4)<br>array (size=4)<br> 0 => string '1' (length=1)<br> 'id' => string '1' (length=1)<br> 1 => string 'm0sh1' (length=5)<br> 'username' => string 'm0sh1' (length=5)</span>
array (size=4)
'id' => string '1' (length=1) 1 => string 'm0sh1' (Länge=5)
sleep<span>__toString()<br>对象当成字符串时的回应方法。例如使用echo $obj;</span>
wakeup
public 'link' => resources(6, mysql link)<span></span>
private 'server' => string 'localhost' (length=9)
<?php class TestClass { public function __toString() { return 'this is a object'; } } $class = new TestClass(); echo $class; ?>private 'password' => string 'moshi' (length=5)
private 'db' => string 'test' (length=4)<span></span>
array (size =4 )<span></span>
0 => Zeichenfolge '1' (Länge=1)
1 => )
'username' => string 'm0sh1' (length=5)
<?php class Invoke{ public function __invoke(){ echo 'in invoke<br>'; } } class noInvoke{ } $obj = new Invoke(); $obj(); var_dump(is_callable($obj)); $obj2 = new noInvoke(); //$obj2(); var_dump(is_callable($obj2));
<p>__toString ()<br>Die Antwortmethode, wenn das Objekt als Zeichenfolge behandelt wird. Verwenden Sie beispielsweise echo $obj;<br></p>
<br><br>
<?php class A { public $var1; public $var2; public static function __set_state ($arr) { $obj = new A; $obj->var1 = 'var11'; $obj->var2 = $arr['var2']; return $obj; } } $a = new A; $a->var1 = 5; $a->var2 = 'foo'; var_dump($a); var_export($a); eval('$ress = '.var_export($a,true).';'); var_dump($ress); ?>, um Folgendes auszugeben:
<br><br>
dies ist ein Objekt<br><br>Diese Methode kann nur eine Zeichenfolge zurückgeben und nicht werfen eine Ausnahme in dieser Methode, andernfalls tritt ein schwerwiegender Fehler auf. <br><br>
Die Antwortmethode beim Aufrufen eines Objekts durch Aufrufen einer Funktion.
<?php 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 error: ' . E_USER_ERROR); } } $a = Singleton::getInstance(); $b = Singleton::getInstance(); if( $a === $b ){ echo 'equal<br>'; } $c = clone $b; ?>Ausgabe:
boolean true
boolean false
__set_state()
Diese statische Methode wird aufgerufen, wenn var_export() aufgerufen wird, um eine Klasse zu exportieren.