魔術方法:
是指某些情況下,會自動呼叫的方法,稱為魔術方法
php物件導向中,提供了這幾個魔術方法,他們的特點都是
以雙下劃線__開頭的
__construct() 構造方法
__destruct() 析構方法
__clone() 轉殖方法 當物件被格隆時,將會自動呼叫
例:class human
}$lisi=new human();
$zhangsan=clone $lisi; //轉殖$lisi物件 //輸出 有人格隆我!假冒
//接下來講6個,在專案中,尤其是自己想寫框架時,很實用的幾個函式
__call()
__callstatic()
__get()
__set()
__isset()
__unset()
********************
__get
例:class human
}$lisi=new human();
echo $lisi->name; //輸出 lisi
echo $lisi->age; //輸出 你想訪問我的age屬性
echo $lisi->friend; //輸出 你想訪問我的friend屬性 當呼叫未定義的屬性時,也會自動呼叫__get方法
可以總結出
當我們呼叫乙個許可權上不允許呼叫的屬性時和不存在的屬性時,
__get魔術方法會自動呼叫,並且自動傳參,引數值是 你呼叫時的屬性名
流程:$lisi->age-無權-->__get('age');
$lisi->friend---沒有此屬性->__get('friend');
生活中,你幫別人看守小賣店
買牙刷-->好,給你牙刷
買毛巾-->好,給你毛巾
這個pos機挺好--->(pos是商店的工具,私有的,不賣,你無權買),但是
我們用__get方法,就有乙個友好的處理機會。
不然系統會直接報錯,甚至fatal error,通過__get,我們就能自己定義訪問時,的處理行為。
__set
接上面$lisi->aaa=111;
$lisi->bbb=222; //呼叫了不存在的屬性並賦值
這兩個居然加到了物件裡
print_r($lisi);
竟然給加上了.
其實,物件就是乙個屬性集,在js中更明顯.
如果這麼隨便就能加上了屬性,導致這個物件屬性過多,不好管理
class stu
}$hmm=new stu();
$hmm->aaa=111; //輸出 你想設定我的aaa屬性
且值是111
print_r($hmm);
$hmm->money="40兩"; //輸出 你想設定我的money屬性 且值是40兩
$hmm->age='28'; //輸出 你想設定我的age屬性 且值是28
$hmm->name='韓美美'; //成功把
$name屬性的值改了
print_r($hmm);
如上,總結出
當為無權操作的屬性賦值時,或不存在的屬性賦值時,__set()自動呼叫且自動傳2個引數 就是你呼叫時的
屬性 屬性值
例:$hmm->age=28 --無權->__set('age',28);
例:class dog
public function __unset($p)
}$hua=new dog();
if(isset($hua->leg))
if(isset($hua->tail))else
__isset()方法
當 isset判斷物件不可見的屬性時(protected/private/不存在的屬性)
都會引發 __isset()來執行
問:isset($obj->xyz)屬性,為真
能說明 類宣告了乙個xyz屬性嗎?
答:不一定
unset($hua->leg); //把$leg變數刪掉了
unset($hua->tail); //呼叫乙個不存在的屬性 會觸發 __unset魔術方法 輸出
你想去掉我的tail
unset($hua->bone); //呼叫了乙個受保護的屬性 也會觸發
__unset魔術方法
__unset()方法
當用 unset銷毀物件的不可見屬性時(protected/private/不存在的屬性)時
會引發 __unset()魔術方法;
例:unsert($hua->tail)---沒有tail屬性--->觸發
__unsert('tail');
例:class human
private function
t()public function
__call($metch,$argu)
}$lisi=new human();
$lisi->hello; //輸出 hello
$lisi->say(); //呼叫未定義的方法會觸發 __call魔術方法
//輸出
你想呼叫乙個我不存在或無權操作的方法say
你呼叫時還傳了引數 array ()
$lisi->t(1,2,3); //呼叫私有的方法 也會觸發 __call 魔術方法
//輸出 你想呼叫乙個我不存在或無權操作的方法t 你呼叫時還傳了引數
array ([0]=>1 [1]=>2 [2]=>3)
$lisi->say(); 沒有say方法----》觸發 __call('say',array());
$lisi->t(1,2,3); 無權操作t方法----》觸發
__call('t',array(1,2,3));
當呼叫乙個未定義或無權操作的方法會觸發 __call魔術方法
第乙個引數是 你呼叫時的方法名
第二個引數是 乙個陣列 你呼叫方法時沒帶引數就是乙個空陣列 帶了引數就是引數組成的陣列
看如上用法
例:
class human
static public function
__callstatic($a,$b)
}$lisi=new human();
human::say('痛苦','悲哀','愛'); //輸出
你想呼叫乙個不存在或無權呼叫的靜態方法say
//你想呼叫時還傳了引數
array ( [0] => 痛苦 [1] => 悲哀 [2] => 愛
) human::qq(); //輸出
你想呼叫乙個不存在或無權呼叫的靜態方法qq
// 你想呼叫時還傳了引數 array (
) __callstatic 是呼叫不可見或無權操作的靜態方法時,會自動呼叫。
宣告__callstatic 注意要帶 static
注意 靜態呼叫不可見或無權操作的靜態方法的時候才會觸發此
__callstatic 魔術方法
例:human::say(1,2,3)--沒有say方法----觸發
__callstatic(『say』,array(1,2,3));
第乙個引數是 你呼叫時的方法名
第二個引數是 乙個陣列 你呼叫方法時沒帶引數就是乙個空陣列 帶了引數就是引數組成的陣列
php中的常用魔術方法彙總
1 php把所有 開頭的方法當做魔術方法,所以任何自定義的方法都不能是 開頭 php提供的過載,是指動態的建立屬性或方法。過載是通過魔術方法來實現的。這些魔術方法的引數不能飲用傳遞,get set isset unset 實現類屬性過載。2 當訪問類中不可訪問的屬性時,將呼叫 get 方法 3 當訪...
php中的常用魔術方法總結
常用的魔術方法有 tostring call autoload 程式設計客棧 clone get set isset unset 1.tostring 用於定義輸出物件引用時呼叫 常用於列印一些物件的資訊 必須有返回值 eg 有乙個persion類 persion per new persion e...
php常用魔術方法
魔術方法和建構函式 construct和複製物件時自動呼叫的函式 clone相似,都是在執行某一操作時會被呼叫,通常和乙個關鍵字相連。通常情況下在類中會定義私有屬性,這是為了保護資料而使用的措施,但是也給我們帶來了麻煩。想要修改它們的值時,是通過呼叫我們定義的介面函式來完成的。每次需要修改變數都要呼...