1. 程式人生 > >PHP魔術方法例項

PHP魔術方法例項

PHP中把以兩個下劃線__開頭的方法稱為魔術方法,這些方法在PHP中充當了舉足輕重的作用。 魔術方法包括:
  • __construct(),類的建構函式
  • __destruct(),類的解構函式
  • __call(),在物件中呼叫一個不可訪問方法時呼叫
  • __callStatic(),用靜態方式中呼叫一個不可訪問方法時呼叫
  • __get(),獲得一個類的成員變數時呼叫
  • __set(),設定一個類的成員變數時呼叫
  • __isset(),當對不可訪問屬性呼叫isset()或empty()時呼叫
  • __unset(),當對不可訪問屬性呼叫unset()時被呼叫。
  • __sleep(),執行serialize()時,先會呼叫這個函式
  • __wakeup(),執行unserialize()時,先會呼叫這個函式
  • __toString(),類被當成字串時的迴應方法
  • __invoke(),呼叫函式的方式呼叫一個物件時的迴應方法
  • __set_state(),呼叫var_export()匯出類時,此靜態方法會被呼叫。
  • __clone(),當物件複製完成時呼叫
<?php
 
class Magic
{
  public $var = 'test';
 
  //建構函式,在建立物件的時候呼叫
  public function __construct()
  {
    echo '__construct called'.PHP_EOL
; } //某個物件的引用都被刪除、物件被銷燬、呼叫exit()後、指令碼關閉時被呼叫 public function __destruct() { echo '__destruct called'.PHP_EOL; } //當給不可訪問或不存在屬性賦值時被呼叫 public function __set($name, $value) { echo $name.'-'.$value; echo '__set called'.PHP_EOL; } //讀取不可訪問或不存在屬性時被呼叫 public function __get($name
) { echo $name; echo '__get called'.PHP_EOL; } //呼叫不可訪問或不存在的方法時被呼叫 public function __call($name, $arguments) { echo $name . '-' . implode(',', $arguments); echo '__call called'.PHP_EOL; } //呼叫不可訪問或不存在的靜態方法時被呼叫 public static function __callStatic($name, $arguments) { echo $name . '-' . implode(',', $arguments); echo '__callStatic called'.PHP_EOL; } //對不可訪問或不存在的屬性呼叫isset()或empty()時被呼叫 public function __isset($name) { echo $name; echo '__isset called'.PHP_EOL; return true; } //對不可訪問或不存在的屬性進行unset時被呼叫 public function __unset($name) { echo $name; echo '__unset called'.PHP_EOL; } //serialize時被呼叫,當你不需要儲存大物件的所有資料時很有用 public function __sleep() { echo '__sleep called'.PHP_EOL; return array('var1111111111'); } //unserialize時被呼叫,可用於做些物件的初始化操作 public function __wakeup() { echo '__wakeup called'.PHP_EOL; $this->var = 'test after wakeup'; } //當一個類被轉換成字串時被呼叫 public function __toString() { return '__toString called'.PHP_EOL; } //進行物件clone時被呼叫,用來調整物件的克隆行為 public function __clone() { echo '__clone called'.PHP_EOL; } //當以函式方式呼叫物件時被呼叫 public function __invoke() { echo '__invoke called'.PHP_EOL; } //當呼叫var_export()匯出類時,此靜態方法被呼叫。用__set_state的返回值做為var_export的返回值。 public static function __set_state($arr) { return '__set_state called'.PHP_EOL; } //當呼叫var_dump()列印物件時被呼叫(當你不想列印所有屬性)適用於PHP5.6版本 public function __debuginfo($arr) { echo '__debuginfo called'.PHP_EOL; return array( 'var' => 'test fro __debuginfo' ); } } $m = new Magic(); //__construct()被呼叫 $m->not_exist_property = test; //__set()被呼叫 echo $m->not_exist_property;//__get()被呼叫 $m->abc(1,2,3); //__call()被呼叫 echo isset($m->not_exist_property); //__isset()被呼叫,返回bool值 unset($m->not_exist_property); //__unset()被呼叫 echo $tmp = serialize($m); //__sleep()被呼叫 unserialize($tmp); //__wakeup()被呼叫 $m1 = clone $m; //__clone()被呼叫,物件預設是引用傳遞,使用clone關鍵詞則可實現物件複製 $m(); //__invoke() eval( '$m2 = ' . var_export ( $m , true ) . ';' );var_dump($m2); var_dump($m); //最後__destruct()被呼叫 /* 結果: __construct called not_exist_property-test__set called not_exist_property__get called abc-1,2,3__call called not_exist_property__isset called 1not_exist_property__unset called __sleep called O:5:"Magic":1:{s:13:"var1111111111";N;}__wakeup called __destruct called __clone called __invoke called string(20) "__set_state called " class Magic#1 (1) { public $var => string(4) "test" } __destruct called __destruct called */