php魔術方法


1、__call(string $Fname, array $arguments);

     在對象中調用一個不可訪問的方法時會調用該方法。用靜態方式調用一個不可訪問的方法時會調用

__callstatic()。

例: function __call($name, $argus){   $err = "Call dont exited function :".$name."(";   for($i=0;$i<count($argus)-1;$i++){    $err.= gettype($argus[$i]).", ";   }   echo $err,gettype($argus[count($argus)-1]),")";  }

2、__construct()構造函數

        如果子類中定義了構造函數,則在實例化子類的實例時就不會隱式調用父類的構造函數。要在子類的

構造函數中執行父類的構造函數:parent::__construct(); 如果子類中沒有定義構造函數,則會從父類繼承。         為了實現向后兼容,如果php 5在類中找不到__construct()並且也沒有從父類繼承的話,他就會嘗試

尋找舊式 的構造函數,也就是和類名同名的函數。

__destruct()  析構函數

        在php中,沒有任何變量指向對象時,該對象占用的內存空間會被釋放,對象被銷毀。這就是php的垃

圾回收機制,防止內存溢出。

        當一個php線程結束時,當前占用的所有內存空間會被釋放,所有對象會被銷毀。

class Person {    public function __destruct(){     echo '析構函數現在執行了 <br />';     } } $p = new Person(); $p = null; // 析構函數在這里執行了 $p = "abc"; // 一樣的效果 for($i = 0; $i < 5; $i++){     echo "$i <br />"; }

3、__clone()        當復制完成時,如果定義了__clone()方法,則新創建的對象(復制生成的對象)中的__clone() 方法會

被調用,可用於修改屬性的值(如果有必要的話)。私有化__clone可以防止克隆該類的對象。   

class B{     static $a = 1;     public $b;

    public function __construct(){         $this->b = ++self::$a;     }     public function __clone(){         $this->b = ++self::$a;     } }

class A{     public $obj1;     public $obj2;

    public function __clone(){          //強制復制一份this->obj1 ,否則保存同一個對象         $this->obj1 = clone $this->obj1;     } } $ad = new A(); $af = $ad;   //clone方法會被調用   ??? $ag = clone $ad;   //強制復制對象

4、__invoke()     當以調用函數的方式調用一個對象時,改魔術方法會被執行。

    例:     class A{         public function __invoke($x){             print_r($x);         }     }     $test = new  A();     $test(9);   //此時__invoke()會被調用

5、__get(string $name)

    在讀取不可訪問的屬性的值時改函數會被調用。$name 是屬性名。

   __set(string $name,mixed $val)     設置不可訪問的值時會調用該方法。通過該方法可以禁止對類屬性的擴展:在沒有該方法的情況下對類對

象的一個不存在的屬性賦值相當於擴展該對象的屬性。    function  __set(){}  //禁止擴展該類對象的屬性

    模擬java的get() 、set() 方法:

class A{  private $asd = 'as';  public function __get($name){       if(isset($name))return $this->$name;       else return false;      }  public function __set($name,$val){       if(isset($name)) $this->$name = $val;  } }

6、__isset(string $name)     當對不可訪問屬性進行isset()或empty()時,改方法會被調用。

7、當對不可訪問屬性調用 unset()時,__unset()  會被調用。

8、__sleep( void )

    serivalize()函數會檢查類中是否存在魔術方法__sleep(),如果存在,該方法會先被調用,然后才執行序

列化操作。此功能可以用於清理對象,並返回一個包含對象中所有應該被序列化的變量名稱的數組。如果該方

法未返回任何內容,則NULL被序列化,並產生E_NOTICE級別的錯誤。

    __sleep()常用作提交未提交的數據,或類似的數據清理工作。同時,如果有一些很大的對象,但不需要保

存全部信息,這個魔術方法就很有用。

    與之相反,unserivalize()會檢查是否存在一個__wakeup()方法,如存在則先調用改方法,預先准備對象

需要的資源。

calss Connection{

    private $server,$user,$password,$db;     protected $link;

    public function __construct($server,$user,$password,$db){         $this->server = $server;         $this->password = $password;         $this->db = $db;         $this->user = $user;         $this->connect();     }

    public function connect(){         $this->link = mysql_connect($this->server,$this->user,$this->password);         mysql_select_db($this->db,$this->link);     }

    public function  __sleep(){         return array('server','user','password','db');   //要保存的屬性     }

    public function __wakeup(){         $this->connect();      //要預備的資源,重新進行數據庫鏈接,或一些其他的初始化操作。     } }

9、自動加載 __autoload

function __autoload($className){     require './'.$className; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM