PHP中的常用魔術方法

2022-08-23 07:33:09 字數 3653 閱讀 3575

魔術方法:

是指某些情況下,會自動呼叫的方法,稱為魔術方法

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相似,都是在執行某一操作時會被呼叫,通常和乙個關鍵字相連。通常情況下在類中會定義私有屬性,這是為了保護資料而使用的措施,但是也給我們帶來了麻煩。想要修改它們的值時,是通過呼叫我們定義的介面函式來完成的。每次需要修改變數都要呼...