<?php header('content-type:text/html;charset=utf-8'); /* * __construct()構(gòu)造方法 * 在對象初始化時(shí)自動(dòng)調(diào)用 * __destruct()析構(gòu)方法 * 在對象釋放資源時(shí)自動(dòng)調(diào)用 * __get()取值 * 在取私有屬性值時(shí)自動(dòng)調(diào)用 * __set()設(shè)置值 * 在設(shè)置私有屬性值自動(dòng)調(diào)用 * __isset()判斷值 * 在使用isset()判斷私有屬性是否存在時(shí)自動(dòng)調(diào)用 * __unset()釋放值 * 在使用unset()釋放私有屬性時(shí)自動(dòng)調(diào)用 * __toString() 用于一個(gè)類被當(dāng)成字符串時(shí)應(yīng)怎樣回應(yīng) * __call() 在對象中調(diào)用一個(gè)不可訪問方法時(shí),__call() 會(huì)被調(diào)用。 * __callstatic()用靜態(tài)方式中調(diào)用一個(gè)不可訪問方法時(shí),__callStatic() 會(huì)被調(diào)用。 :: * __sleep() 在串行化serialize時(shí)自動(dòng)調(diào)用的方法 * __wakeup() 在反串行化時(shí)自動(dòng)調(diào)用的方法 * __set_state() 當(dāng)調(diào)用 var_export() 導(dǎo)出類時(shí),此靜態(tài) 方法會(huì)被調(diào)用。 * __invoke()當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對象時(shí),__invoke() 方法會(huì)被自動(dòng)調(diào)用。 * __autoload() 唯一一個(gè)在類外部進(jìn)行定義 自動(dòng)加載 只要在這個(gè)腳本中,需要加載類的時(shí)候(必須用到類名)就會(huì)自動(dòng)調(diào)用這個(gè)方法。 * * 魔術(shù)方法的總結(jié): * 1.自動(dòng)調(diào)用,但不同的魔術(shù)方法,有自己的調(diào)用時(shí)機(jī) * 2.都是以__開始的方法 * 3.所有的魔術(shù)方法,方法名都是固定的 * 4.如果不寫,就不存在,也就沒有默認(rèn)的功能。 * * __toString() * 1.是在直接使用echo print printf輸出一個(gè)對象引用時(shí),自動(dòng)調(diào)用的方法 * 2.將對象的基本信息放在__toString()方法內(nèi)部,形成字符串返回。 * 3.__toString()方法中不能有參數(shù)。 * * 克隆對象 * 1.使用clone這個(gè)關(guān)鍵字復(fù)制一個(gè)對象 * * __clone()魔術(shù)方法 * 1.是在克隆對象時(shí)自動(dòng)調(diào)用的方法 * 2.作用:和構(gòu)造方法一樣,是對新克隆的對象進(jìn)行初始化 * * __call() * 1.就是在調(diào)用一個(gè)對象中不存的方法時(shí),自動(dòng)調(diào)用的方法 * 2.有兩個(gè)參數(shù),第一個(gè)參數(shù)是,調(diào)用的不存在的方法的方法名,第二個(gè)參數(shù)是調(diào)用不存在的方法的方法參數(shù) * 作用: * 1.可以寫提示信息 * 2.將方法的功能相似,但方法名還要不同的,就可以采用這個(gè)方式來完成 * * * 對象串行化 (序列化) * 1.將對象轉(zhuǎn)成字符串---串行化 * __sleep() * 作用: * 可以設(shè)置需要串行化的對象的屬性 * 只要在這個(gè)方法中,返回一個(gè)數(shù)組,在數(shù)組中聲明了那個(gè)屬性名,那個(gè)屬性名就會(huì)被串行化。 * 沒有聲明的屬性名,不串行化 * 默認(rèn)這個(gè)方法,全部串行化 * 2.將字符串轉(zhuǎn)成對象---反串行化 * __wakeup() 在反串行化時(shí)自動(dòng)調(diào)用 * 作用: * 對象串行化的對象回來后,進(jìn)行對象的初始化,相當(dāng)于__construct() * serialize() 函數(shù)會(huì)檢查類中是否存在一個(gè)魔術(shù)方法 __sleep() 如果存在,該方法會(huì)先被調(diào)用,然后才執(zhí)行序列化操作 * 注意(串行化時(shí)機(jī)) * 1.將對象需要進(jìn)行網(wǎng)絡(luò)傳輸時(shí)。 * 2.將對象持久保存時(shí)。 * * 數(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'); //初始化時(shí)調(diào)用構(gòu)造函數(shù) function __construct($name,$age,$sex){ $this->name = $name; $this->age = $age; $this->sex = $sex; } //echo 對象時(shí)調(diào)用 function __toString(){ return '本人的基本信息如下:我是津沙港灣,30歲,男性<br/>'; } //clone對象時(shí)調(diào)用 function __clone(){ echo '克隆一個(gè)對象,this是一個(gè)副本<br/>'; $this->name; $this->age=20; $this->sex; } /* //提示信息 function __call($method,$args){ echo '在調(diào)用一個(gè)對象中不存的方法時(shí)自動(dòng)調(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時(shí)調(diào)用 function __sleep(){ echo '指定串行化的對象屬性名<br/>'; return array('name','age');//必須返回?cái)?shù)組 //指定只串行化name和age這個(gè)兩個(gè)對象屬性 //O:6:"Person":2:{s:4:"name";s:12:"津沙港灣";s:3:"age";i:23;} } //反串行化 unserialize時(shí)調(diào)用 function __wakeup(){ echo '反串行化時(shí)自動(dòng)調(diào)用<br/>'; //反串行化時(shí)設(shè)置成員屬性的值 $this->age = 43; } //var_export導(dǎo)出類信息 static function __set_state($arr){//參數(shù)是數(shù)組 echo 'var_export導(dǎo)出類信息時(shí)自動(dòng)調(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)用對象時(shí)自動(dòng)調(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);//變成一個(gè)對象 /* object(stdClass)[1] public 'name' => string '津沙港灣' (length=12) public 'age' => int 32 public 'sex' => string 'male' (length=4) */ //變成一個(gè)對象 echo $parr->name; //轉(zhuǎn)成數(shù)組 要加第二個(gè)參數(shù)true $parr = json_decode($str,true); var_dump($parr); //var_export __set_state() $p = new Person("津沙港灣", 20, "male"); //設(shè)定的屬性可以傳到$arr中去 $p->name = '火山島'; $p->age = 500; $p->sex = 'male'; eval('$b='.var_export($p,true).';');//加ture變成字符串 var_dump($b);//類信息以__set_state()中設(shè)定值為準(zhǔn) //調(diào)用函數(shù)方式 $p(1,2,3); //__callstatic 調(diào)用不存在的靜態(tài)方法時(shí)自動(dòng)調(diào)用 Person::speak(); //__autoload 調(diào)用類中的方法時(shí)自動(dòng)加載類文件 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;
當(dāng)前文章:PHP對象魔術(shù)方法
分享網(wǎng)址:http://chinadenli.net/article10/pgpjgo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、移動(dòng)網(wǎng)站建設(shè)、微信小程序、建站公司、域名注冊、品牌網(wǎng)站設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)