13個PHP魔術函式
__construct()
例項化物件時被呼叫, 當__construct和以類名為函式名的函式同時存在時,__construct將被呼叫,另一個不被呼叫。
__destruct()
當刪除一個物件或物件操作終止時被呼叫。
__call()
物件呼叫某個方法, 若方法存在,則直接呼叫;若不存在,則會去呼叫__call函式。
__get()
讀取一個物件的屬性時,若屬性存在,則直接返回屬性值; 若不存在,則會呼叫__get函式。
__set()
設定一個物件的屬性時, 若屬性存在,則直接賦值;
若不存在,則會呼叫__set函式。__toString()
列印一個物件的時被呼叫。如echo obj;
__clone()
克隆物件時被呼叫。如:t1=clone $t;
__sleep()
serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。
__wakeup()
unserialize時被呼叫,做些物件的初始化工作。
__isset()
檢測一個物件的屬性是否存在時被呼叫。如:isset($c->name)。
__unset()
unset一個物件的屬性時被呼叫。如:unset($c->name)。
__set_state()
呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。
__autoload()
例項化一個物件時,如果對應的類不存在,則該方法被呼叫。
舉例說明
1 魔術方法 __get() 當試圖讀取一個並不存在的屬性的時候被呼叫。
如果試圖讀取一個物件並不存在的屬性的時候,PHP就會給出錯誤資訊。如果在類裡新增__get方法,並且我們可以用這個函式實現類似java中反射的各種操作。
class Test
{
public function __get($key)
{
echo $key . " 不存在";
}
}
$t = new Test();
echo $t->name;
就會輸出:name 不存在
2 魔術方法 __set() 當試圖向一個並不存在的屬性寫入值的時候被呼叫。
class Test
{
public function __set($key, $value)
{
echo '對' . $key . "附值" . $value;
}
}
$t = new Test();
$t->name = "aninggo";
就會輸出:對 name 附值 aninggo
3 魔術方法 __call() 當試圖呼叫一個物件並不存在的方法時,呼叫該方法。
class Test
{
public function __call($Key, $Args)
{
echo "您要呼叫的 {$Key} 方法不存在。你傳入的引數是:" . print_r($Args, true);
}
}
$t = new Test();
$t->getName(aning, go);
程式將會輸出:
您要呼叫的 getName 方法不存在。引數是:Array
(
[0] => aning
[1] => go
)
4 魔術方法 __toString() 當列印一個物件的時候被呼叫,這個方法類似於java的toString方法,當我們直接列印物件的時候回撥用這個函式。
class Test
{
public function __toString()
{
return "列印 Test";
}
}
$t = new Test();
echo $t;
執行echo 的時候,就會呼叫 __toString(); 從而程式將會輸出:列印 Test;
5 魔術方法__clone() 當物件被克隆時,被呼叫。
class Test
{
public function __clone()
{
echo "我被複制了!";
}
}
$t = new Test();
$t1 = clone $t;
程式輸出:我被複制了!