1. 程式人生 > >13個PHP魔術函式

13個PHP魔術函式

  1. __construct()

    例項化物件時被呼叫, 當__construct和以類名為函式名的函式同時存在時,__construct將被呼叫,另一個不被呼叫。

  2. __destruct()

    當刪除一個物件或物件操作終止時被呼叫。

  3. __call()

    物件呼叫某個方法, 若方法存在,則直接呼叫;若不存在,則會去呼叫__call函式。

  4. __get()

    讀取一個物件的屬性時,若屬性存在,則直接返回屬性值; 若不存在,則會呼叫__get函式。

  5. __set()

    設定一個物件的屬性時, 若屬性存在,則直接賦值;
    若不存在,則會呼叫__set函式。

  6. __toString()

    列印一個物件的時被呼叫。如echo obj;printobj;

  7. __clone()

    克隆物件時被呼叫。如:t=newTest();t1=clone $t;

  8. __sleep()

    serialize之前被呼叫。若物件比較大,想刪減一點東東再序列化,可考慮一下此函式。

  9. __wakeup()

    unserialize時被呼叫,做些物件的初始化工作。

  10. __isset()

    檢測一個物件的屬性是否存在時被呼叫。如:isset($c->name)。

  11. __unset()

    unset一個物件的屬性時被呼叫。如:unset($c->name)。

  12. __set_state()

    呼叫var_export時,被呼叫。用__set_state的返回值做為var_export的返回值。

  13. __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;

程式輸出:我被複制了!