一、什么是魔術(shù)方法:
成都創(chuàng)新互聯(lián)公司堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的云浮網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
PHP為我們提供了一系列用__開(kāi)頭的函數(shù),這些函數(shù)無(wú)需自己手動(dòng)調(diào)用,會(huì)在合適的時(shí)機(jī)自動(dòng)調(diào)用,這類函數(shù)稱為魔術(shù)函數(shù)。
例如:
1 | function __construct(){} 在 new 一個(gè)新對(duì)象時(shí)自動(dòng)調(diào)用此函數(shù) |
二、PHP中都有那些魔術(shù)方法,以及它們的作用:
1.__construct():構(gòu)造函數(shù),new對(duì)象時(shí)自動(dòng)調(diào)用
eg:
class Person{ public $name; public $age; function __construct($name,$age){ $this->name=$name; $this->age=$age; } }
在new新的Person對(duì)象時(shí)會(huì)自動(dòng)調(diào)用__construct()函數(shù),將傳入的參數(shù)分別賦給$name,$age。
2.__destruct():析構(gòu)函數(shù),當(dāng)一個(gè)對(duì)象被銷(xiāo)毀前自動(dòng)調(diào)用
class Person{ public $name; public $age; function __destruct(){ echo "這個(gè)對(duì)象被銷(xiāo)毀了"; } }
同上所述,對(duì)象被銷(xiāo)毀時(shí)執(zhí)行此魔術(shù)方法
3.__get():訪問(wèn)類中私有屬性時(shí)自動(dòng)調(diào)用,傳遞讀取屬性名,返回$this->屬性名
class Person{ private $name; public $age; function __get($name){ return $this->$name; } }
如上代碼,$name被設(shè)為私有屬性后不能直接通過(guò)$this->name;的方式讀取,因此需要設(shè)置__get()魔術(shù)方法來(lái)讀取。
4.__set():給類的私有屬性賦值時(shí)自動(dòng)調(diào)用,傳遞需設(shè)置的屬性名,屬性值
class Person{ private $name; public $age; function __set($key,$value){ $this->$key=$value; } }
同__get()方法,私有屬性不能通過(guò)$this->name="aaa";的方式直接設(shè)置,需要設(shè)置__set()方法,傳入的參數(shù)分別是屬性名和屬性值。
5.__isset():使用isset檢測(cè)對(duì)象私有屬性時(shí)調(diào)用,傳遞檢測(cè)的屬性名,返回isset($this->屬性名)
class Person{ private $name; public $age; function __isset($name){ return isset($this->$name); } }
使用isset檢測(cè)對(duì)象私有屬性時(shí)調(diào)用,其他同上。
6.__unset():使用unset()函數(shù)刪除對(duì)象私有屬性時(shí)調(diào)用,傳遞刪除的屬性名,方法中執(zhí)行unset($this->屬性名)
class Person{ private $name; public $age; function __unset($name){
unset($this->$name);
} }
同上,在用unset()函數(shù)刪除私有屬性時(shí)調(diào)用。
7.__toString():使用echo打印對(duì)象時(shí)調(diào)用,返回打印對(duì)象時(shí)想要顯示的內(nèi)容,返回必須是字符串
class Person{ public $name; public $age; function __toString(){ $str = <<<str 您要打印的內(nèi)容是:<br> \$name=>{$this->name};<br> \$age=>{$this->age};<br>str; return $str; } }
使用echo打印對(duì)象時(shí)調(diào)用,返回打印對(duì)象時(shí)想要顯示的內(nèi)容。
8.__call():調(diào)用一個(gè)類中未定義的或未公開(kāi)的方法時(shí)自動(dòng)調(diào)用,傳遞被調(diào)用的函數(shù)名及參數(shù)列表
__call(, "您調(diào)用的函數(shù){},參數(shù)列表"( "不存在/未公開(kāi)"
如代碼所示,調(diào)用不存在的say(1,2,3);時(shí),會(huì)打印
您調(diào)用的函數(shù)way,參數(shù)列表Array ( [0] => 123 ) 不存在
9.__clone():當(dāng)使用clone關(guān)鍵字,克隆一個(gè)對(duì)象時(shí)自動(dòng)調(diào)用,作用是為新克隆的對(duì)象初始化賦值
class Person{ public $name; public $age; function __clone(){ $this->name="lisi"; } } $zhangsan=new Person("zhangsan",24);$lisi=clone $zhangsan;echo $lisi->name;
打印出的結(jié)果是"lisi",而不是"zhangsan"。
10.__sleep():對(duì)象序列化時(shí)自動(dòng)調(diào)用,返回一個(gè)數(shù)組,數(shù)組中的值就是可以序列化的屬性
class Person{ public $name; public $age; function __sleep(){ return array("name","age"); } }
如上述代碼,在用serialize()序列化對(duì)象時(shí)只有"name","age"屬性會(huì)被序列化。
11.__wakeup():對(duì)象反序列化時(shí)自動(dòng)調(diào)用,為反序列化新產(chǎn)生的對(duì)象進(jìn)行初始化賦值
class Person{ public $name; public $age; function __wakeup(){ $this -> name = "lisi"; } }
將對(duì)象序列化后再反序列化,同時(shí)給對(duì)象的name屬性賦初值為"lisi"。
12.__autolode():需要在類外部聲明函數(shù),當(dāng)實(shí)例化一個(gè)未聲明的類時(shí)自動(dòng)調(diào)用,傳遞實(shí)例化的類名,可以使用類名自動(dòng)加載對(duì)應(yīng)的類文件。
function __autoload($className){ include "class/".strtolower($className).".class.php"; } $zhangsan=new Person();$zhangsan->say();
如上述代碼,Person類不存在時(shí)調(diào)用__autolode()方法,載入寫(xiě)在文件外的類,"class/".strtolower($className).".class.php";就是類文件的相對(duì)路徑,$className就是
不在本文件中的類的類名,因此在創(chuàng)建外部類文件時(shí)命名方式必須是小寫(xiě)的類名.class.php。__autolode()方法也是惟一一個(gè)不用寫(xiě)在類中的魔術(shù)方法。
以上就是PHP中的魔術(shù)方法,合理利用這些方法可以輕松實(shí)現(xiàn)對(duì)象的各種操作。
當(dāng)前文章:PHP中的面向?qū)ο驩OP中的魔術(shù)方法
分享地址:http://bm7419.com/article28/gejgjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機(jī)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、服務(wù)器托管、App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、小程序開(kāi)發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)