程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP的魔術方法學習

PHP的魔術方法學習

編輯:關於PHP編程

    __set_state()
    var_export可以把一個集合導出為一串字符串,這些字符串是一些可執行的PHP代碼。在php5.1.0的面向對象裡,引入了一個叫__set_state的靜態方法來使得var_export支持對象實例的導出。當用var_export導出一個實例的時候,所導出字符串裡,是調用這個靜態方法的代碼。這個方法有一個參數,為包含所導出的實例的所有成員屬性的一個數組。有點抽象,看下面的例子吧。
    <?phpclass o{ public $skill=’php’; public static function __set_state($arr) {  foreach ($arr as $k => $v) {   $obj->$k = $v;  }         return $obj; }}$i = new o;$i->age = 21;eval(’$b = ’.var_export($i,true).’;’);//這裡的true表示var_export返回所導出的字符串,而不是把它打印出來。print_r($b);/*輸出:stdClass Object(    [skill] => php    [age] => 21)*/?>

    __clone()
    在php5裡,對象間的賦值總是以地址引用來傳遞的。例如下面這個例子,將會輸出66,而不是55.
    <?phpclass o{ public $age = 55;}$i   = new o;$i2 = $i;$i->age = 66;echo $i2->age;?>
    如果要以實際值來傳遞,則需要用到clone關鍵詞。
    <?phpclass o{ public $age = 55;}$i   = new o;$i2 = clone $i;$i->age = 66;echo $i2->age;//輸出55?>
    但是,這裡clone的只是$i這個實例。如果$i的某個成員屬性也是個實例,那麼這個成員屬性還是會以引用方法被傳遞到$i2的。例如下面這個例子:
    <?phpclass o{ public $age = 55; public $sub = null;}class o2{ public $p=1;}$i   = new o;$i->sub=new o2;$i2 = clone $i;$i->sub->p=5;echo $i2->sub->p;?>
    最後輸出的是5,而不是1。也就是說,$i和$i2雖然不是指向的雖然不是同一個實例,但是它們的成員屬性$sub卻是指向同一個實例。這時候,我們必須借助__clone這個方法來對$sub進行復制。在o類裡,加入__clone()方法。如下:
    <?phpclass o{ public $age = 55; public $sub = null; public function __clone() {  $this->sub=clone $this->sub; }}//......?>
    這樣,在echo $i2->sub->p;的時候,輸出的就是傳遞時候的值1了。
    __autoload()
    當創建一個實例化的時候,如果對應的類不存在,__autoload()將會被執行,這個函數有一個參數,為所要創建的實例對應的類名。在下面的例子裡,當創建一個test類的實例的時候,如果/home/surfchen/project/auto.php存在,則require這個文件,否則打印一個Class test Not Found的錯誤,並中止當前腳本。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved