
日期:2006-09-26 作者:喜騰小二 來源:PHPChina
第19章 類與物件(PHP5) 之十:魔法方法(Magic Methods)
函式名__construct, __destruct (注意構造函式和析構函式), __call,
__get, __set, __isset, __unset (注意多載), __sleep, __wakeup, __toString,
__set_state, __clone and __autoload是PHP類裡邊的魔法函式.
函式名 __construct,
__destruct(注意構造函式和析構函式), __call, __get, __set, __isset, __unset (see 注意多載),
__sleep, __wakeup, __toString, __set_state, __clone and
__autoload在PHP類裡是魔術的.在任何類裡妳不能用這些名字給函式命名除非妳想與它們的魔術功能性相關聯。
注意:
PHP儲量將所有用__開始的函式名作為魔術函式。推薦地,在PHP裡不能用__做函式名除非妳想用檔案證明是魔術函式。
__sleep()和__wakeup()
serialize()
檢查類中是否有魔術名稱 __sleep
的函式。如果這樣,該函式將在任何序列化之前執行。它可以清除物件並應該返回一個包含有該物件中應被序列化的所有變數名的陣列。
使用 __sleep
的目的是關閉物件可能俱有的任何資料庫連線,提交等待中的資料或進行類似的清除工作。此外,如果有非常大的物件而並不需要完全儲存下來時此函式也很有用。
相反地,unserialize()
檢查俱有魔術名稱 __wakeup 的函式的存在。如果存在,此函式可以重建物件可能俱有的任何資源。
使用 __wakeup
的目的是重建在序列化中可能丟失的任何資料庫連線以及處理其它重新初始化的工作。
例子 19-25. Sleep and wakeup
PHP程式碼如下:
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() { mysql_close($this->link); }
public function __wakeup() { $this->connect(); }
}
?>
__toString
__toString方法允許一個類決定當它被修改為string類型時是如何起作用的。
例子
19-26.Simple example
PHP程式碼如下:
php
class TestClass// Declare a simple class
{ public $foo;
public function __construct($foo){ $this->foo = $foo; }
public function __toString() { return $this->foo; }
}
$class = new TestClass('Hello');
echo $class;
?>
上例將輸出:Hello
__toString方法將隻在使用echo()和print()直接地組合時被調用是一個有效的注釋方法。
例子 19-27. Cases where
__toString is called
PHP程式碼如下:
php
echo $class; //__toString called
echo 'text',$class; //__toString called (still a normal parameter for echo)
echo 'text'.$class; // __toString not called (concatenation operator used first)
echo (string)$class; //__toString not called (cast to string first)
echo "text $class";//__toString not called (cast to string first)
?>
__set_state
從PHP
5.1.0開始static方法是透過var_export()函式來訪問類介麵的。這個方法的唯一參數是一個包含內容出口的以為array(‘property’=value,…)形式的陣列