標籤: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 對象 魔術方法