在之前的文章中給大家?guī)?lái)了《PHP中clone關(guān)鍵字和__clone()方法的使用(實(shí)例詳解)》,其中給大家詳細(xì)的介紹了PHP中的clone關(guān)鍵字和__clone()方法,本篇文章繼續(xù)給大家?guī)?lái)PHP中的魔術(shù)方法,希望對(duì)大家有幫助!
在我們之前的文章中,我們介紹__clone()方法的時(shí)候提到,這是魔術(shù)方法的一種,《帶你分清類中的構(gòu)造函數(shù)與析構(gòu)函數(shù)》中也提到的構(gòu)造函數(shù)與析構(gòu)函數(shù)也叫作構(gòu)造方法與析構(gòu)方法,他們也是魔術(shù)方法的一種。那么什么是魔術(shù)方法?它有哪些常用的方法?它又是怎樣使用的?接下來(lái)我們一起來(lái)看一看吧。
PHP魔術(shù)方法
在PHP面向?qū)ο缶幊讨?,PHP里有一系列的魔術(shù)方法,這些魔術(shù)方法看看之前學(xué)習(xí)的__clone
__construct
__destruct
我們能發(fā)現(xiàn)一個(gè)共同點(diǎn),那就是它們都是由__
兩個(gè)下劃線開(kāi)始的,并且都是在某種特定的條件下自動(dòng)調(diào)用的。
那接下來(lái)我們來(lái)看一看一些常用的魔術(shù)方法,結(jié)合實(shí)例來(lái)看一下它們的使用方法。
__set()
方法
__set()
方法用于在為當(dāng)前環(huán)境下未定義或不可見(jiàn)的類屬性賦值時(shí),需要注意的是所有的魔術(shù)方法,都是在某種特定條件下自動(dòng)調(diào)用的,為當(dāng)前環(huán)境下未定義或不可見(jiàn)的類屬性賦值時(shí)就是__set()
方法調(diào)用的特定條件。
語(yǔ)法格式如下:
public function __set(要操作的變量, 要操作變量的值){ ... ... ; }
實(shí)例如下:
<?php class father{ public $study1; private $study2; public function __set($key, $value){ echo '為“'.$key.'”賦值“'.$value.'”失??!<br>'; } } $object = new father(); $object -> study1 = '好好學(xué)習(xí)'; $object -> study2 = '天天向上'; $object -> study3 = '福如東海'; ?>
輸出結(jié)果:
由上述實(shí)例看出,當(dāng)當(dāng)前環(huán)境下未定義或不可見(jiàn)的類屬性賦值時(shí),就會(huì)調(diào)用__set()方法。
__get()
方法
自動(dòng)調(diào)用 __get()
方法的特定條件是在調(diào)用或獲取當(dāng)前環(huán)境下未定義或不可見(jiàn)的類屬性時(shí),定義該方法的語(yǔ)法格式如下:
public function __get($name){ ... ... ; }
其中參數(shù)$name表示要操作的變量名稱,下面通過(guò)實(shí)例我們來(lái)看一下__get()方法的使用,實(shí)例如下:
<?php class father{ public $study = '好好學(xué)習(xí)'; private $study1 = '天天向上'; public function __get($study1){ echo '獲?。骸?#39;.$study1.'”失??!'; } } $object = new father(); echo $object -> study.'<br>'; echo $object -> study1.'<br>'; echo $object -> study2.'<br>'; ?>
輸出結(jié)果:
由上述結(jié)果可以看出在調(diào)用或獲取當(dāng)前環(huán)境下未定義或不可見(jiàn)的類屬性時(shí),會(huì)自動(dòng)調(diào)用 __get() 方法。
__isset()
方法
自動(dòng)調(diào)用 __isset() 方法的特定條件是當(dāng)在類外部對(duì)類中不可訪問(wèn)或不存在的屬性使用 isset()
或 empty()
函數(shù)時(shí),該方法的語(yǔ)法格式如下:
public function __isset($name){ ... ... ; }
其中我們需要注意的是:
參數(shù) $name 為要訪問(wèn)的屬性名稱。
-
isset()
函數(shù)是用來(lái)檢查一個(gè)變量是否存在并且還要判斷不為 NULL,如果傳入的變量存在則傳回 true,不存在傳回 false。 -
empty()
函數(shù)是用來(lái)檢查一個(gè)變量是否為空,如果變量的值等于 FALSE,那么這個(gè)變量會(huì)被認(rèn)為不存在。 -
如果想要使用 isset() 或 empty() 函數(shù)對(duì)類中的私有屬性進(jìn)行檢測(cè)的話,我們只需要在類中添加一個(gè) __isset() 方法就可以了,當(dāng)在類外部使用 isset() 或 empty() 函數(shù)時(shí),會(huì)自動(dòng)調(diào)用類里面的 __isset() 方法。
接下來(lái)我們通過(guò)實(shí)例來(lái)看一下__isset()方法的使用,實(shí)例如下:
<?php class father{ public $study = '好好學(xué)習(xí)'; private $name = '天天向上'; public function __isset($name){ if(property_exists('Website', $name)){ echo '成員屬性:“'.$name.'”存在!<br>'; }else{ echo '成員屬性:“'.$name.'”不存在!<br>'; } } } $object = new father(); isset($object -> mother); isset($object -> name); ?>
輸出結(jié)果:
其中我們需要注意的是,property_exists()
函數(shù)可以用來(lái)檢測(cè)類中是否定義了該屬性,語(yǔ)法格式為
property_exists($class_name,$property_name)
其中 $class_name 為字符串形式的類名,即判斷類 class_name 中是否定義了 property_name 屬性。
__unset()
方法
自動(dòng)調(diào)用__unset()
方法的特定條件是當(dāng)在類外部對(duì)類中不可訪問(wèn)或不存在的屬性使用 unset() 函數(shù)時(shí),該方法的語(yǔ)法格式如下:
public function __unset($name){ ... ... ; }
其中我們需要注意的是:
-
參數(shù) $name 為要訪問(wèn)的屬性名稱。
-
unset() 函數(shù)的作用是刪除指定的變量,需要傳入一個(gè)或多個(gè)變量作為參數(shù),另外,該函數(shù)沒(méi)有返回值。
-
可以使用 unset() 函數(shù)在類外部去刪除類中的成員屬性。如果要?jiǎng)h除類中的公有屬性的話直接使用 unset() 函數(shù)即可;
-
如果要?jiǎng)h除類中的私有屬性的話,則需要在類中添加一個(gè) __unset() 方法。
接下來(lái)我們通過(guò)實(shí)例來(lái)看一下__unset()方法的使用,實(shí)例如下:
<?php class father{ public $name = 'http://c.biancheng.net/php/'; private $study = 'C語(yǔ)言中文網(wǎng)'; public function __unset($study){ if(property_exists('father', $study)){ unset($this->$study); echo '移除成員屬性:“'.$study.'”成功!<br>'; }else{ echo '成員屬性:“'.$study.'”不存在!<br>'; } } } $object = new father(); unset($object->name); unset($object->study); unset($object->study1); ?>
輸出結(jié)果:
由上述實(shí)例看出當(dāng)在類外部對(duì)類中不可訪問(wèn)或不存在的屬性使用 unset() 函數(shù)時(shí),__unset() 方法會(huì)被自動(dòng)調(diào)用。
上述實(shí)例中給大家介紹了一些常用的魔術(shù)方法,但這并不是魔術(shù)方法的全部,那接下來(lái)再給大家列舉一些魔術(shù)方法:
-
__call()
— 調(diào)用一個(gè)不存在的方法時(shí)自動(dòng)調(diào)用 -
__sleep()
— 使用 serialize 序列化時(shí)自動(dòng)調(diào)用 -
__toString()
— 把對(duì)象轉(zhuǎn)換成字符串時(shí)自動(dòng)調(diào)用 -
__invoke()
— 當(dāng)嘗試把對(duì)象當(dāng)方法調(diào)用時(shí)自動(dòng)調(diào)用 -
__wakeup()
— 使用 unserialize 反序列化時(shí)自動(dòng)調(diào)用 -
__callStatic()
— 調(diào)用一個(gè)不存在的靜態(tài)方法時(shí)自動(dòng)調(diào)用 -
__debugInfo()
— 使用 var_dump() 打印對(duì)象信息時(shí)自動(dòng)調(diào)用 -
__set_state()
— 當(dāng)使用 var_export() 函數(shù)時(shí)自動(dòng)調(diào)用,接受一個(gè)數(shù)組參數(shù)
大家如果感興趣的話,可以點(diǎn)擊《PHP視頻教程》進(jìn)行