您好,登錄后才能下訂單哦!
<?php header('content-type:text/html;charset=utf-8'); /* * __construct()構(gòu)造方法 * 在對象初始化時自動調(diào)用 * __destruct()析構(gòu)方法 * 在對象釋放資源時自動調(diào)用 * __get()取值 * 在取私有屬性值時自動調(diào)用 * __set()設置值 * 在設置私有屬性值自動調(diào)用 * __isset()判斷值 * 在使用isset()判斷私有屬性是否存在時自動調(diào)用 * __unset()釋放值 * 在使用unset()釋放私有屬性時自動調(diào)用 * __toString() 用于一個類被當成字符串時應怎樣回應 * __call() 在對象中調(diào)用一個不可訪問方法時,__call() 會被調(diào)用。 * __callstatic()用靜態(tài)方式中調(diào)用一個不可訪問方法時,__callStatic() 會被調(diào)用。 :: * __sleep() 在串行化serialize時自動調(diào)用的方法 * __wakeup() 在反串行化時自動調(diào)用的方法 * __set_state() 當調(diào)用 var_export() 導出類時,此靜態(tài) 方法會被調(diào)用。 * __invoke()當嘗試以調(diào)用函數(shù)的方式調(diào)用一個對象時,__invoke() 方法會被自動調(diào)用。 * __autoload() 唯一一個在類外部進行定義 自動加載 只要在這個腳本中,需要加載類的時候(必須用到類名)就會自動調(diào)用這個方法。 * * 魔術(shù)方法的總結(jié): * 1.自動調(diào)用,但不同的魔術(shù)方法,有自己的調(diào)用時機 * 2.都是以__開始的方法 * 3.所有的魔術(shù)方法,方法名都是固定的 * 4.如果不寫,就不存在,也就沒有默認的功能。 * * __toString() * 1.是在直接使用echo print printf輸出一個對象引用時,自動調(diào)用的方法 * 2.將對象的基本信息放在__toString()方法內(nèi)部,形成字符串返回。 * 3.__toString()方法中不能有參數(shù)。 * * 克隆對象 * 1.使用clone這個關(guān)鍵字復制一個對象 * * __clone()魔術(shù)方法 * 1.是在克隆對象時自動調(diào)用的方法 * 2.作用:和構(gòu)造方法一樣,是對新克隆的對象進行初始化 * * __call() * 1.就是在調(diào)用一個對象中不存的方法時,自動調(diào)用的方法 * 2.有兩個參數(shù),第一個參數(shù)是,調(diào)用的不存在的方法的方法名,第二個參數(shù)是調(diào)用不存在的方法的方法參數(shù) * 作用: * 1.可以寫提示信息 * 2.將方法的功能相似,但方法名還要不同的,就可以采用這個方式來完成 * * * 對象串行化 (序列化) * 1.將對象轉(zhuǎn)成字符串---串行化 * __sleep() * 作用: * 可以設置需要串行化的對象的屬性 * 只要在這個方法中,返回一個數(shù)組,在數(shù)組中聲明了那個屬性名,那個屬性名就會被串行化。 * 沒有聲明的屬性名,不串行化 * 默認這個方法,全部串行化 * 2.將字符串轉(zhuǎn)成對象---反串行化 * __wakeup() 在反串行化時自動調(diào)用 * 作用: * 對象串行化的對象回來后,進行對象的初始化,相當于__construct() * serialize() 函數(shù)會檢查類中是否存在一個魔術(shù)方法 __sleep() 如果存在,該方法會先被調(diào)用,然后才執(zhí)行序列化操作 * 注意(串行化時機) * 1.將對象需要進行網(wǎng)絡傳輸時。 * 2.將對象持久保存時。 * * 數(shù)組串行化 json ----javascript object notation * * 1.eval()函數(shù)--檢查并執(zhí)行PHP代碼 * $str = "echo 'abc' ;"; * eval($str); */ class Person{ public $name; public $age; public $sex; public $marr = array('eat','drink','song'); //初始化時調(diào)用構(gòu)造函數(shù) function __construct($name,$age,$sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; } //echo 對象時調(diào)用 function __toString(){ return '本人的基本信息如下:我是津沙港灣,30歲,男性<br/>'; } //clone對象時調(diào)用 function __clone(){ echo '克隆一個對象,this是一個副本<br/>'; $this->name; $this->age=20; $this->sex; } /* //提示信息 function __call($method,$args){ echo '在調(diào)用一個對象中不存的方法時自動調(diào)用__call<br/>'; echo "調(diào)用的方法{$method}(),參數(shù)為:"; print_r($args); echo "不存在<br/>"; } */ //調(diào)用不同的方法名 function __call($method,$args){ if(in_array($method, $this->marr)){ foreach ($args as $arg) echo $arg."<br/>"; }else{ echo "您調(diào)用的方法{$method}()不存在"; } } static function __callstatic($method,$args){ echo "您調(diào)用的靜態(tài)方法{$method}不存在"; } function say() { echo '我是津沙港灣<br/>'; } //串行化 serialize時調(diào)用 function __sleep(){ echo '指定串行化的對象屬性名<br/>'; return array('name','age');//必須返回數(shù)組 //指定只串行化name和age這個兩個對象屬性 //O:6:"Person":2:{s:4:"name";s:12:"津沙港灣";s:3:"age";i:23;} } //反串行化 unserialize時調(diào)用 function __wakeup(){ echo '反串行化時自動調(diào)用<br/>'; //反串行化時設置成員屬性的值 $this->age = 43; } //var_export導出類信息 static function __set_state($arr){//參數(shù)是數(shù)組 echo 'var_export導出類信息時自動調(diào)用<br/>'; $p = new Person("小狀元", 33, "female"); $p->name = $arr['name']; $p->age = $arr['age']; $p->sex = $arr['sex']; return $p; } //調(diào)用函數(shù)方式調(diào)用對象 $p(); function __invoke($a,$b,$c){ echo '調(diào)用函數(shù)方式調(diào)用對象時自動調(diào)用'.$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 對象轉(zhuǎn)成字符串 $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', ); //數(shù)組串行化{"name":"\u6d25\u6c99\u6e2f\u6e7e","age":32,"sex":"male"} $str = json_encode($arr); echo $str; //數(shù)組反串行化 轉(zhuǎn)成對象 $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; //轉(zhuǎn)成數(shù)組 要加第二個參數(shù)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()中設定值為準 //調(diào)用函數(shù)方式 $p(1,2,3); //__callstatic 調(diào)用不存在的靜態(tài)方法時自動調(diào)用 Person::speak(); //__autoload 調(diào)用類中的方法時自動加載類文件 function __autoload($classname){ include $classname.'.class.php'; } Test::laugh();
對象反串行化 include 'index.php'; //讀取文件內(nèi)容 字符串 $str = file_get_contents('MrYang.txt'); //反串行化 字符串轉(zhuǎn)成對象 $p = unserialize($str); $p ->say(); echo $p->age;
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。