PHP 對象 魔術方法

來源:互聯網
上載者:User

標籤:php 對象 魔術方法

<?phpheader(‘content-type:text/html;charset=utf-8‘);/* * __construct()構造方法 * 在對象初始化時自動調用 * __destruct()析構方法 * 在對象釋放資源時自動調用 * __get()取值 * 在取私人屬性值時自動調用 * __set()設定值 * 在設定私人屬性值自動調用 * __isset()判斷值 * 在使用isset()判斷私人屬性是否存在時自動調用 * __unset()釋放值 * 在使用unset()釋放私人屬性時自動調用 * __toString() 用於一個類被當成字串時應怎樣回應 * __call() 在對象中調用一個不可存取方法時,__call() 會被調用。 * __callstatic()用靜態方式中調用一個不可存取方法時,__callStatic() 會被調用。 ::  * __sleep() 在序列化serialize時自動調用的方法 *  __wakeup() 在反序列化時自動調用的方法 * __set_state() 當調用 var_export() 匯出類時,此靜態 方法會被調用。 * __invoke()當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。 * __autoload() 唯一一個在類外部進行定義 自動載入 只要在這個指令碼中,需要載入類的時候(必須用到類名)就會自動調用這個方法。 *  * 魔術方法的總結: * 1.自動調用,但不同的魔術方法,有自己的調用時機 * 2.都是以__開始的方法 * 3.所有的魔術方法,方法名都是固定的 * 4.如果不寫,就不存在,也就沒有預設的功能。 *  * __toString() * 1.是在直接使用echo print printf輸出一個對象引用時,自動調用的方法 * 2.將對象的基本資料放在__toString()方法內部,形成字串返回。 * 3.__toString()方法中不能有參數。 *  * 複製對象 * 1.使用clone這個關鍵字複製一個對象 *  * __clone()魔術方法 * 1.是在複製對象時自動調用的方法 * 2.作用:和構造方法一樣,是對新複製的對象進行初始化 *  * __call() * 1.就是在調用一個對象中不存的方法時,自動調用的方法 * 2.有兩個參數,第一個參數是,調用的不存在的方法的方法名,第二個參數是調用不存在的方法的方法參數 * 作用: * 1.可以寫提示資訊  * 2.將方法的功能相似,但方法名還要不同的,就可以採用這個方式來完成 *  * * 對象序列化  (序列化) * 1.將對象轉成字串---序列化 *  __sleep() *  作用: *  可以設定需要序列化的對象的屬性 *  只要在這個方法中,返回一個數組,在數組中聲明了那個屬性名稱,那個屬性名稱就會被序列化。 *  沒有聲明的屬性名稱,不序列化 *  預設這個方法,全部序列化 * 2.將字串轉成對象---反序列化 * __wakeup() 在反序列化時自動調用 * 作用: * 對象序列化的對象回來後,進行對象的初始化,相當於__construct() * serialize() 函數會檢查類中是否存在一個魔術方法 __sleep() 如果存在,該方法會先被調用,然後才執行序列化操作 * 注意(序列化時機) * 1.將對象需要進行網路傳輸時。 * 2.將對象持久儲存時。 *  * 數組序列化 json  ----javascript object notation *  * 1.eval()函數--檢查並執行PHP代碼  * $str = "echo ‘abc‘ ;"; * eval($str); */ class Person{    public $name;    public $age;    public $sex;    public $marr = array(‘eat‘,‘drink‘,‘song‘);    //初始化時調用建構函式    function __construct($name,$age,$sex){        $this->name = $name;        $this->age     = $age;        $this->sex     = $sex;    }    //echo 對象時調用    function __toString(){      return ‘本人的基本資料如下:我是津沙港灣,30歲,男性<br/>‘;    }    //clone對象時調用    function __clone(){        echo ‘複製一個對象,this是一個副本<br/>‘;        $this->name;        $this->age=20;        $this->sex;    }    /*     //提示資訊    function __call($method,$args){        echo ‘在調用一個對象中不存的方法時自動調用__call<br/>‘;        echo "調用的方法{$method}(),參數為:";        print_r($args);        echo "不存在<br/>";    }    */    //調用不同的方法名    function __call($method,$args){                if(in_array($method, $this->marr)){                    foreach ($args as $arg)                    echo $arg."<br/>";                }else{                    echo "您調用的方法{$method}()不存在";                }    }            static function __callstatic($method,$args){        echo "您調用的靜態方法{$method}不存在";    }        function say() {        echo ‘我是津沙港灣<br/>‘;    }        //序列化 serialize時調用    function __sleep(){        echo ‘指定序列化的對象屬性名稱<br/>‘;       return array(‘name‘,‘age‘);//必須返回數組       //指定只序列化name和age這個兩個對象屬性       //O:6:"Person":2:{s:4:"name";s:12:"津沙港灣";s:3:"age";i:23;}    }        //反序列化 unserialize時調用    function __wakeup(){        echo ‘反序列化時自動調用<br/>‘;        //反序列化時設定成員屬性的值        $this->age = 43;    }        //var_export匯出類資訊    static function __set_state($arr){//參數是數組        echo ‘var_export匯出類資訊時自動調用<br/>‘;        $p = new Person("小狀元", 33, "female");        $p->name = $arr[‘name‘];        $p->age = $arr[‘age‘];        $p->sex = $arr[‘sex‘];        return $p;    }        //調用函數方式調用對象 $p();    function __invoke($a,$b,$c){        echo ‘調用函數方式調用對象時自動調用‘.$a.$b.$c.‘<br/>‘;    }    }//原本$p = new Person(‘津沙港灣‘,23,‘男‘);//toString()echo $p;//__call()$p->eat(‘魚‘,‘肉‘);$p->drink(‘茶‘,‘酒‘);$p->song(‘歌‘,‘戲‘);//副本 __clone()$a = clone $p;echo $a->age;//serialize 對象轉成字串$str = serialize($p);//O:6:"Person":4:{s:4:"name";s:12:"津沙港灣";s:3:"age";i:23;s:3:"sex";s:3:"男";s:4:"marr";a:3:{i:0;s:3:"eat";i:1;s:5:"drink";i:2;s:4:"song";}}file_put_contents("MrYang.txt", $str);echo ‘對象序列化成功,儲存到MrYang檔案中‘;$arr = array(        ‘name‘ => ‘津沙港灣‘,        ‘age‘    => 32,        ‘sex‘    => ‘male‘,    );    //數組序列化{"name":"\u6d25\u6c99\u6e2f\u6e7e","age":32,"sex":"male"}    $str = json_encode($arr);    echo $str;        //數組反序列化 轉成對象    $parr = json_decode($str);    var_dump($parr);//變成一個對象    /*  object(stdClass)[1]  public ‘name‘ => string ‘津沙港灣‘ (length=12)  public ‘age‘ => int 32  public ‘sex‘ => string ‘male‘ (length=4)     */    //變成一個對象    echo $parr->name;    //轉成數組 要加第二個參數true    $parr = json_decode($str,true);    var_dump($parr);//var_export  __set_state()$p = new Person("津沙港灣", 20, "male");//設定的屬性可以傳到$arr中去$p->name = ‘火山島‘;$p->age = 500;$p->sex = ‘male‘;eval(‘$b=‘.var_export($p,true).‘;‘);//加ture變成字串var_dump($b);//類資訊以__set_state()中設定值為準//調用函數方式$p(1,2,3);//__callstatic 調用不存在的靜態方法時自動調用Person::speak();//__autoload 調用類中的方法時自動載入類檔案function __autoload($classname){    include $classname.‘.class.php‘;}Test::laugh();
對象反序列化include ‘index.php‘;//讀取檔案內容 字串$str = file_get_contents(‘MrYang.txt‘);//反序列化 字串轉成對象$p = unserialize($str);$p ->say();echo $p->age;


本文出自 “津沙港灣” 部落格,請務必保留此出處http://11410485.blog.51cto.com/11400485/1844991

PHP 對象 魔術方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.