php常用魔術方法
魔術方法和建構函式__construct和複製物件時自動呼叫的函式__clone相似,都是在執行某一操作時會被呼叫,通常和一個關鍵字相連。
__set()
通常情況下在類中會定義私有屬性,這是為了保護資料而使用的措施,但是也給我們帶來了麻煩。想要修改它們的值時,是通過呼叫我們定義的介面函式來完成的。每次需要修改變數都要呼叫不同的介面,這是比較麻煩的,所以PHP提供了一個魔術方法__set()來方便我們的賦值操作
__set()語法:authority(訪問控制關鍵字) function __set($varname(要賦值的成員屬性名),$value(要給成員屬性付的值)){.....}
__set()函式接受兩個引數
程式碼示例:
<?php class test{ public $name; private $age; private $sex; public function __set($varname,$value){ if($varname=='age'){ if($value<130&&$value>10){ $this->age=$value; }else{ echo 'age賦值錯誤<br>'; } } if($varname=='sex'){ if($value=='男'||$value=='女'){ $this->sex=$value; }else{ echo 'sex賦值錯誤<br>'; } } } public function info(){ echo '我叫'.$this->name.'<br>'; echo '我是'.$this->sex.'孩<br>'; echo '我今年'.$this->age.'歲了<br>'; } } $tom=new test(); $tom->name='湯姆'; $tom->age=18; $tom->sex='男'; $tom->info(); $tom->sex='女'; $tom->info(); $tom->age=140; $tom->info(); ?>
從上面的程式碼可以看出,雖然兩個成員屬性是私有的,但是也可以在外部賦值,這就是__set()發揮了作用
__get()
__get()的作用是在類的外部訪問類的私有成員屬性的時候,會自動呼叫__get()方法返回屬性的值,它有一個引數用來接收屬性名
__get()語法:authority(訪問控制關鍵字) function __get($varname(要訪問的成員方法名)){....}
程式碼示例:
<?php class test{ private $name; private $age; private $sex; public function __get($varname){ if($varname=='name'){ echo '我的名字是'.$this->name.'<br>'; return; } if($varname=='age'||$varname=='sex'){ echo '我的性別和年齡是保密的<br>'; }else{ echo '不存在你要訪問的成員屬性<br>'; } } public function __construct($name,$age,$sex){ $this->name=$name; $this->age=$age; $this->sex=$sex; } } $tom=new test('湯姆',19,'男'); $tom->name; $tom->age; $tom->sex; $tom->school; ?>
注意:if中的條件判斷語句是兩個等號,不要丟掉,這是血的教訓啊,眼都要找瞎了
從程式碼可以看出,語句在外部直接訪問了類的私有成員屬性而程式是沒有報錯的,這是因為呼叫了__get()方法。當然,我們也可以在__get()方法中加一些條件限制,來控制訪問的許可權
__call()
__call()函式用於物件訪問的函式不存在或沒有足夠的訪問許可權時會被系統自動呼叫
__call()語法:authority(訪問控制關鍵字) function __call($varname(要呼叫的成員方法名),$value(要呼叫方法的引數列表)){.....}
程式碼示例:
<?php
class test{
public function __call($varname,$value){
echo '你呼叫的函式'.$varname.'不存在或不可訪問<br>';
}
public function say(){
echo '我向你問好<br>';
}
private function hello(){
echo '我向你說hello<br>';
}
}
$tom=new test();
$tom->say();
$tom->hello();
$tom->get();
?>
從上面的程式碼可以看出,在訪問不存在的成員函式get()和私有函式hello()時,自動呼叫了__call()並輸出提示
__callStatic
__callStatic()的功能和__call()的功能是一樣的,只不過是針對靜態函式的。__callStatic()是針對呼叫靜態函式而定義的函式
__callstatic()語法:public(訪問控制關鍵字必須為public) static(必須被修飾為靜態方法) function __callStatic($varname,$values){....}
程式碼示例:
<?php
class test{
public static function __callStatic($varname,$value){
echo '你呼叫的函式'.$varname.'不存在或不可訪問<br>';
}
public static function say(){
echo '我向你問好<br>';
}
private static function hello(){
echo '我向你說hello<br>';
}
}
test::say();
test::hello();
test::get();
?>
靜態方法這樣呼叫: