這篇文章詳細(xì)的對(duì)php中的常用魔術(shù)方法進(jìn)行了整理歸納,分享給大家供大家參考,具體內(nèi)容如下
1、PHP把所有”__”開(kāi)頭的方法當(dāng)做魔術(shù)方法,所以任何自定義的方法都不能是”__”開(kāi)頭
php提供的重載,是指動(dòng)態(tài)的創(chuàng)建屬性或方法。重載是通過(guò)魔術(shù)方法來(lái)實(shí)現(xiàn)的。這些魔術(shù)方法的參數(shù)不能飲用傳遞,__get(),__set(),__isset(),__unset(),實(shí)現(xiàn)類屬性重載。
2、當(dāng)訪問(wèn)類中不可訪問(wèn)的屬性時(shí),將調(diào)用__get()方法
3、當(dāng)訪問(wèn)類中不可訪問(wèn)的屬性時(shí),根據(jù)不同的情況會(huì)調(diào)用__get(),__set(),__isset(),__unset(),其中當(dāng)訪問(wèn)屬性 時(shí),使用函數(shù)isset()或empty()時(shí),將調(diào)用__isset()方法使用unset()函數(shù)時(shí),將調(diào)用__unset()方法。
4、這四個(gè)方法不能使用static關(guān)鍵詞定義,在php5.3.0后,一個(gè)warning級(jí)別的警告將發(fā)生,當(dāng)使用static方法定義這4個(gè)方法。
5、何謂不可訪問(wèn)的屬性:(1)類中沒(méi)有的屬性,(2)私有變量在類外被訪問(wèn)。方法重載,通過(guò)__call()和__callstatic()來(lái)實(shí) 現(xiàn),兩者的區(qū)別是一個(gè)上下文環(huán)境是否是靜態(tài)方法,后者在調(diào)用不可訪問(wèn)的靜態(tài)方法時(shí)會(huì)被調(diào)用。__callstatic()是在php5.3.0中才被添 加。
6、__sleep()和__wakeup()
serialize()序列化時(shí),會(huì)先檢查是否存在__sleep()函數(shù),如果存在,則先調(diào)用__sleep(),返回一個(gè)包含所有變量名稱的數(shù)組,如果該方法不返回任何內(nèi)容,則null被序列化,并產(chǎn)生一個(gè)notice級(jí)別的錯(cuò)誤。
__wakeup()方法和__sleep()相反,在調(diào)用unserialize()時(shí)被調(diào)用
7、__toString(),讓一個(gè)類決定它如何轉(zhuǎn)換成字符串,在php5.2.0之前,這個(gè)方法只能結(jié)合echo或print方法生效,php5.2.0之后,可以結(jié)合printf()修飾,但修飾的時(shí)候也不能用類似%d之類的非字符修飾符。
8、__invoke(),當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用對(duì)象時(shí),將出發(fā)這個(gè)函數(shù),只在php5.3之后生效。
9、__set_state()靜態(tài)方法,當(dāng)調(diào)用var_export()的時(shí)候,才會(huì)調(diào)用這個(gè)靜態(tài)方法,php5.1.0之后生效。唯一參數(shù)是接收一個(gè)數(shù)組。
10、__construct()和__destruct(),構(gòu)造函數(shù)和析構(gòu)函數(shù),構(gòu)造函數(shù)主要用于類的初始化,析構(gòu)函數(shù)在某個(gè)對(duì)象的所有引用都 刪除后或者對(duì)象被顯示的銷毀時(shí)運(yùn)行。在析構(gòu)函數(shù)中不允許拋出異常,否則會(huì)出發(fā)一個(gè)fatal error,析構(gòu)函數(shù)在腳本結(jié)束時(shí)調(diào)用,此時(shí)所有的http header都已經(jīng)發(fā)出.
11、__clone(),對(duì)象復(fù)制,此方法不能直接被調(diào)用,必須通過(guò)clone關(guān)鍵字顯示調(diào)用
代碼:
//實(shí)例化對(duì)象時(shí),會(huì)調(diào)用對(duì)象的__construct方法$obj = new Object();//給對(duì)象不存在的屬性賦值時(shí),會(huì)調(diào)用對(duì)象的__set方法$obj->title = "hello";//使用對(duì)象不存在的屬性時(shí),會(huì)調(diào)用對(duì)象的__get方法echo $obj->title;//調(diào)用對(duì)象不存在的方法時(shí),會(huì)調(diào)用對(duì)象的__call方法$obj->test("hello",123,567);//調(diào)用不存在的類靜態(tài)方法時(shí),會(huì)調(diào)用類的__callStatic方法Object::staticMethod("static","not found method");//直接輸出對(duì)象時(shí),會(huì)調(diào)用對(duì)象的__toString方法echo $obj;//將一個(gè)對(duì)象當(dāng)作函數(shù)一樣使用時(shí),會(huì)調(diào)用對(duì)象的__invoke方法echo $obj("test");//克隆對(duì)象時(shí),會(huì)調(diào)用對(duì)象的__clone方法$obj2 = clone $obj;//判斷對(duì)象屬性是否存在時(shí),會(huì)調(diào)用對(duì)象的__isset方法var_dump(isset($obj->aaa));//銷毀對(duì)象屬性時(shí),會(huì)調(diào)用對(duì)象的__unset方法unset($obj->aaa); class Object{ protected $array = array(); function __construct() { echo __METHOD__."你正在實(shí)例化對(duì)象<br>"; } function __set($name, $value) { $this->array[$name]=$value; } function __get($name) { return $this->array[$name]; } function __call($name, $arguments) { var_dump($name,$arguments); return "magic function/n"; } static function __callStatic($name, $arguments) { var_dump($name,$arguments); return "magic static function"; } function __toString() { return __CLASS__.'<br>'; } function __invoke($arguments) { var_dump($arguments); return __METHOD__.'<br>'; } function __clone() { echo __METHOD__."你正在克隆對(duì)象<br>"; } function __isset($name) { echo __METHOD__."你想判斷有沒(méi)有屬性".$name."<br>"; return 1; } function __unset($name) { echo __METHOD__."你想刪除屬性".$name."<br>"; } function __destruct() { echo __METHOD__."你正在注銷對(duì)象<br>"; } }
以上就是關(guān)于php中的常用魔術(shù)方法的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。