php的魔術方法1

2021-06-25 15:18:34 字數 3428 閱讀 3096

首先,先了解下什麼是魔術方法?

特定情況下能夠自動呼叫的方法,比如熟知的建構函式,析構函式。

魔術方法有什麼特徵呢?

以雙下劃線開頭,建構函式,析構函式是不是有這個特徵呢?是的。__construct  __destruct

php裡還有我們不熟知但常用的方法:__get  __set __isset  __unset

接下來說說他們吧。

1、__get方法

以下例子,若不用魔術方法會發生什麼情況呢?

<?php

class fun_get

$ob = new fun_get();

echo $ob->id;

echo $ob->name;

echo $ob->age;

?>

瀏覽器執行的結果是這樣的:26

fatal error: cannot access protected property fun_get::$name

為什麼會這樣呢?

因為$name屬於保護屬性,不允許物件呼叫,所以就會報錯,當然$age屬於私有屬性,也不允許物件呼叫,所以也會報錯。

如果使用魔術方法,還會這樣麼?

<?php

class fun_get

}$ob = new fun_get();

echo $ob->id; echo '

';echo $ob->name;

echo $ob->age;

echo $ob->birthday;

?>

使用魔術方法後,執行結果是這樣的: 26 

抱歉,你不能使用變數name

抱歉,你不能使用變數age

抱歉,你不能使用變數birthday

這樣,就沒有「致命」錯誤的提示了,因為當執行到「echo $ob->name;」時,發現物件呼叫了許可權不允許呼叫的屬性時,__get方法就自動被呼叫,並且把該屬性作為引數傳過去,所以就列印出「抱歉,你不能使用變數name」。執行到「echo $ob->age;」也是一樣的道理。當發現物件呼叫了乙個沒被定義的屬性時,__get方法也會自動被呼叫。

【總結】物件呼叫了許可權不允許呼叫的屬性時,或物件呼叫了乙個沒被定義的屬性時,__get方法會被自動呼叫。

2、__set方法

乙個例子先睹為快

<?php

class fun_set

$ob = new fun_set();

$ob->qq = 10001;

print_r($ob);

$ob->age = 23;

print_r($ob);

?>

執行結果會是怎樣的?

結果如下:

fun_set object ( [id] => 26 [name:protected] => memi [age:fun_set:private] => 21 [qq] => 10001 ) 

fatal error: cannot access private property fun_set::$age in d:\www\php.php on line 15

執行$ob->qq = 10001;

物件就多了乙個屬性和屬性值(這樣不好吧~~)

執行$ob->age = 23;

是更改私有屬性age的值,這是不允許的。

如果使用魔術方法會是怎樣的?

<?php

class fun_set

}$ob = new fun_set();

$ob->qq = 10001;

print_r($ob);

echo '

------------------------------

';$ob->id = 10001;

print_r($ob);

echo '

------------------------------

';$ob->age = 23;

print_r($ob);

?>

執行結果是這樣的:

令qq=10001//呼叫了魔術方法

fun_set object ( [id] => 26 [name:protected] => memi [age:fun_set:private] => 21 ) 

------------------------------

fun_set object ( [id] => 10001 [name:protected] => memi [age:fun_set:private] => 21 ) 

------------------------------

令age=23//呼叫了魔術方法

fun_set object ( [id] => 10001 [name:protected] => memi [age:fun_set:private] => 21 )

分析:執行$ob->qq = 10001;

物件會自動呼叫__set方法,阻止這個賦值的發生,因為該物件沒有這個屬性。

執行$ob->id = 23;

是更改屬性id的值,這是允許的。所以魔術方法並沒有被呼叫。

執行$ob->age = 23;

這是要更改私有屬性age的值,顯然物件沒有這個許可權,所以__set方法會自動被呼叫,阻止這個改值的發生。

【總結】物件更改許可權不允許更改的屬性值時,或物件定義乙個沒被定義的屬性並賦值時,__set方法會被自動呼叫。

3、__isset方法

<?php

class fun_set

$ob = new fun_set();

if(isset($ob->id))

echo '

';echo $ob->age;

?>

執行結果:

26notice: undefined property: fun_set::$age in d:\www\php.php on line 17

分析:報錯是因為沒有age屬性

使用魔術方法會怎樣?

<?php

class fun_set

}$ob = new fun_set();

if(isset($ob->id))

echo '

';if(isset($ob->age))

?>

執行結果:26

沒有屬性age

分析:不存在age屬性,所以自動呼叫__isset方法

【總結】當物件呼叫的屬性是protected,private,未定義的屬性時,__isset自動呼叫。

4、__unset方法

php的魔術函式(魔術方法)

construct 類的建構函式 destruct 類的析構函式 call 在物件中呼叫乙個不可訪問方法時呼叫 callstatic 用靜態方式中呼叫乙個不可訪問方法時呼叫 get 獲得乙個類的成員變數時呼叫 set 設定乙個類的成員變數時呼叫 isset 當對不可訪問屬性呼叫isset 或empt...

php魔術常量,魔術方法

魔術常量 1。line 返回檔案中的當前行號。2。file 返回檔案的完整路徑和檔名。如果用在包含檔案中,則返回包含檔名。自php4.0.2 起,file 總是包含乙個絕對路徑,而在此之前的版本有時會包含乙個相對路徑。3。function 返回函式名稱 php4.3.0 新加 自php5 起本常量返...

invoke 魔術 PHP 魔術方法

php 魔術方法 構造方法 construct 析構方法 destruct get 與 set unset call 和 callstatic sleep 和 wakeup clone tostring invoke set state debuginfo construct 這個方法應該是最常用的...