熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

PHP的魔術方法學習

2013-11-15 12:22:00  來源: PHP編程 

  __set_state()
var_export可以把一個集合導出為一串字符串這些字符串是一些可執行的PHP代碼在php的面向對象裡引入了一個叫__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 = ;eval(’$b = ’var_export($itrue)’;’);//這裡的true表示var_export返回所導出的字符串而不是把它打印出來print_r($b);/*輸出stdClass Object(    [skill] => php    [age] => )*/?>

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


From:http://tw.wingwit.com/Article/program/PHP/201311/20813.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.