新聞中心

在衡東等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計制作按需求定制開發(fā),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),全網(wǎng)營銷推廣,外貿(mào)網(wǎng)站制作,衡東網(wǎng)站建設(shè)費(fèi)用合理。
前面我們介紹的構(gòu)造函數(shù) __construct 和析構(gòu)函數(shù) __destruct 就屬于 PHP 中的魔術(shù)方法。PHP 中的魔術(shù)方法如下表所示:
| 魔術(shù)方法 | 作用 |
|---|---|
| __construct() | 實(shí)例化類時自動調(diào)用 |
| __destruct() | 類對象使用結(jié)束時自動調(diào)用 |
| __set() | 在給未定義的屬性賦值時自動調(diào)用 |
| __get() | 調(diào)用未定義的屬性時自動調(diào)用 |
| __isset() | 使用 isset() 或 empty() 函數(shù)時自動調(diào)用 |
| __unset() | 使用 unset() 時自動調(diào)用 |
| __sleep() | 使用 serialize 序列化時自動調(diào)用 |
| __wakeup() | 使用 unserialize 反序列化時自動調(diào)用 |
| __call() | 調(diào)用一個不存在的方法時自動調(diào)用 |
| __callStatic() | 調(diào)用一個不存在的靜態(tài)方法時自動調(diào)用 |
| __toString() | 把對象轉(zhuǎn)換成字符串時自動調(diào)用 |
| __invoke() | 當(dāng)嘗試把對象當(dāng)方法調(diào)用時自動調(diào)用 |
| __set_state() | 當(dāng)使用 var_export() 函數(shù)時自動調(diào)用,接受一個數(shù)組參數(shù) |
| __clone() | 當(dāng)使用 clone 復(fù)制一個對象時自動調(diào)用 |
| __debugInfo() | 使用 var_dump() 打印對象信息時自動調(diào)用 |
前面我們已經(jīng)介紹過了《構(gòu)造函數(shù)》和《析構(gòu)函數(shù)》,下面我們再來介紹幾個常用的魔術(shù)方法。
1、__set() 方法
在為當(dāng)前環(huán)境下未定義或不可見的類屬性賦值時,會自動調(diào)用 __set() 方法。定義該方法的語法格式如下:
public function __set($key, $value){
... ... ;
}
其中,參數(shù) $key 是要操作的變量名稱,$value 為變量 $key 的值。
【示例】下面使用簡單的示例來演示一下 __set() 方法的使用。
';
}
}
$object = new Website();
$object -> name = 'C語言中文網(wǎng)';
$object -> url = 'http://c.biancheng.net/php/';
$object -> title = 'PHP教程';
?>
運(yùn)行結(jié)果如下:
為“url”賦值“http://c.biancheng.net/php/”失??!
為“title”賦值“PHP教程”失??!
利用 __set() 方法的特性,我們可以通過 __set() 方法為類中的使用 private 關(guān)鍵詞修飾的屬性進(jìn)行賦值或修改。如下所示:
$key)){
$this -> $key = $value;
}else{
echo '為“'.$key.'”賦值“'.$value.'”失敗!
';
}
}
public function getUrl(){
echo $this -> url;
}
}
$object = new Website();
$object -> name = 'C語言中文網(wǎng)';
$object -> url = 'http://c.biancheng.net/php/';
$object -> title = 'PHP教程';
$object -> getUrl();
?>
運(yùn)行結(jié)果如下:
為“title”賦值“PHP教程”失敗!
http://c.biancheng.net/php/
2、__get() 方法
在調(diào)用或獲取當(dāng)前環(huán)境下未定義或不可見的類屬性時,會自動調(diào)用 __get() 方法,定義該方法的語法格式如下:
public function __get($name){
... ... ;
}
參數(shù) $name 為要操作的變量名稱。
【示例】下面使用簡單的示例來演示一下 __get() 方法的使用。
url.'
'; echo $object -> name.'
'; echo $object -> title.'
'; ?>
運(yùn)行結(jié)果如下:
http://c.biancheng.net/php/
獲?。骸皀ame”失敗!
獲?。骸皌itle”失??!
3、__isset() 方法
當(dāng)在類外部對類中不可訪問或不存在的屬性使用 isset() 或 empty() 函數(shù)時,會自動調(diào)用 __isset() 方法,該方法的語法格式如下:
public function __isset($name){
... ... ;
}
參數(shù) $name 為要訪問的屬性名稱。
isset() 函數(shù)可以檢查一個變量是否存在并且不為 NULL,傳入一個變量作為參數(shù),如果傳入的變量存在則傳回 true,否則傳回 false。
empty() 函數(shù)可以檢查一個變量是否為空,同樣需要傳入一個變量作為參數(shù),如果變量并不存在,或者變量的值等于 FALSE,那么這個變量會被認(rèn)為不存在。
通過前面的學(xué)習(xí)我們知道,類中的公有成員可以在類外訪問,而私有成員則無法在類外訪問。也就是說,我們可以使用 isset() 或 empty() 函數(shù)來檢查類中的公有屬性是否存在,而對類中的私有屬性這兩個函數(shù)就無效了。
如果想要使用 isset() 或 empty() 函數(shù)對類中的私有屬性進(jìn)行檢測的話,我們只需要在類中添加一個 __isset() 方法就可以了,當(dāng)在類外部使用 isset() 或 empty() 函數(shù)時,會自動調(diào)用類里面的 __isset() 方法。
【示例】下面使用簡單的示例來演示一下 __isset() 方法的使用。
';
}else{
echo '成員屬性:“'.$name.'”不存在!
';
}
}
}
$object = new Website();
isset($object -> title);
isset($object -> name);
?>
運(yùn)行結(jié)果如下:
成員屬性:“title”不存在!
成員屬性:“name”存在!
提示:property_exists() 函數(shù)可以用來檢測類中是否定義了該屬性,語法格式為 property_exists($class_name,$property_name),其中 $class_name 為字符串形式的類名,即判斷類 class_name 中是否定義了 property_name 屬性。
4、__unset() 方法
當(dāng)在類外部對類中不可訪問或不存在的屬性使用 unset() 函數(shù)時,__unset() 方法會被自動調(diào)用,該方法的語法格式如下:
public function __unset($name){
... ... ;
}
參數(shù) $name 為要訪問的屬性名稱。
我們先來看一下 unset() 函數(shù),unset() 函數(shù)的作用是刪除指定的變量,需要傳入一個或多個變量作為參數(shù),另外,該函數(shù)沒有返回值。
同樣,我們也可以使用 unset() 函數(shù)在類外部去刪除類中的成員屬性。與上面介紹的 __isset() 方法相似,如果要刪除類中的公有屬性的話直接使用 unset() 函數(shù)即可;如果要刪除類中的私有屬性的話,則需要在類中添加一個 __unset() 方法。
【示例】下面使用簡單的示例來演示一下 __unset() 方法的使用。
$name);
echo '移除成員屬性:“'.$name.'”成功!
';
}else{
echo '成員屬性:“'.$name.'”不存在!
';
}
}
}
$object = new Website();
unset($object->url);
unset($object->name);
unset($object->abc);
?>
運(yùn)行結(jié)果如下:
移除成員屬性:“name”成功!
成員屬性:“abc”不存在!
5、__call() 方法
當(dāng)調(diào)用類中一個不可訪問或不存在的方法時,__call() 方法會被調(diào)用。該方法的語法格式如下:
public function __call($name, $arguments){
... ... ;
}
其中,$name 為要調(diào)用的方法名稱,$arguments 為傳遞給 $name 的參數(shù)所組成的數(shù)組。
當(dāng)調(diào)用的方法不存在時會自動調(diào)用 __call() 方法,程序會繼續(xù)執(zhí)行下去,從而可以避免當(dāng)調(diào)用方法不存在時產(chǎn)生錯誤所導(dǎo)致的程序終止。
【示例】下面使用簡單的示例來演示一下 __call() 方法的使用。
';
}
public function __call($name, $arguments){
echo '你所調(diào)用的方法:'.$name;
if(!empty($arguments)){
echo '【以及參數(shù):';
print_r($arguments);
echo '】';
}
echo ' 不存在!
';
}
}
$obj = new Website();
$obj -> say();
$obj -> url('http://c.biancheng.net/php/');
$obj -> title();
?>
運(yùn)行結(jié)果如下:
Welcome C語言中文網(wǎng)!
你所調(diào)用的方法:url【以及參數(shù):Array ( [0] => http://c.biancheng.net/php/ ) 】 不存在!
你所調(diào)用的方法:title 不存在!
6、__clone() 方法
可以使用 clone 關(guān)鍵字復(fù)制對象,當(dāng)復(fù)制完成時,如果定義了 __clone() 方法,則新創(chuàng)建的對象(復(fù)制生成的對象)中的 __clone() 方法會被自動調(diào)用,通過該方法我們可以做一些必要的操作。__clone() 方法的語法格式如下:
public function __clone(){
... ... ;
}
該函數(shù)不需要傳入?yún)?shù)。
【示例】下面使用簡單的示例來演示一下 __clone() 方法的使用。
';
}
public function __clone(){
echo '對象克隆成功
';
}
}
$obj = new Website();
$obj2 = clone $obj;
echo '';
var_dump($obj, $obj2);
?>
運(yùn)行結(jié)果如下:
對象克隆成功
object(Website)#1 (0) {
}
object(Website)#2 (0) {
}
標(biāo)題名稱:PHP魔術(shù)方法(附帶實(shí)例)
分享URL:http://www.dlmjj.cn/article/cddphid.html


咨詢
建站咨詢
