PHP的魔術函式和魔術常量
阿新 • • 發佈:2019-02-02
魔術方法:
PHP把類中所有以__(兩個下劃線)開頭的方法當成魔術方法,一般建議使用者不要將自定義的方法前面加上__作為字首。魔術方法:1. __construct()
類的預設構造方法,如果__construct()和與類同名的方法共同出現時,預設呼叫__construct()而不是同類名方法。一般情況下使用者自定義構造方法也會使用__construct()。
2. __destruct()
類的解構函式,當該物件的所有引用都被刪除,或者物件被顯式銷燬時執行。
3. __get($name)
可以簡單歸納為:用$object->a的方式讀取物件的屬性時,如果屬性a存在且是public型,那麼直接返回該屬性的值;如果屬性a不存在或者是protected/private這樣的不可直接訪問的型別,就會呼叫__get($name)方法並以返回值為準。一般可以使用該方法使外部可限制性地訪問內部屬性,或者完成類似java中的反射操作。
4. __set($name, $value)
與__get($name)類似,用$object->a = 17的方式給屬性賦值時,如果屬性a存在且是public型,那麼直接給屬性a賦值皆可;如果屬性a不存在或者是protected/private型,就會呼叫__set($name, $value)方法。
5. __call($name, $arguments) / __callStatic($name, $arguments)
當呼叫不存在或者不可訪問的方法時,會呼叫__call($name, $arguments)方法。而當在靜態方法中呼叫不存在或者不可訪問的方法時,會呼叫__callStatic($name, $arguments)方法。
6. __toString()
當列印物件時會被直接呼叫。如echo $object;
7. __clone()
當物件被拷貝時直接呼叫。如$a = new Action(); $a = $object;
8. __isset($name) / __unset($name)
對不存在或者不可訪問的屬性使用isset()或者empty()時,__isset()會被呼叫;當unset一個不存在或者不可訪問的屬性時,__unset()會被呼叫,否則直接unset該屬性皆可。
9. __set_state()
用var_export()輸出一個物件時,__set_state()會被呼叫,輸出內容以該魔術方法的返回值為準。注:var_export()和var_dump()類似,只是var_export()輸出的內容符合php語法。
$test = new Test();
$b = var_export($test, true);
var_dump($b);
class Test {
public $a;
public static function __set_state($array) {
$ab = new Test();
$ab->a = 10;
return $ab;
}
}
10. __autoload($name)
例項化一個物件時,如果對應的類不存在,則該方法被呼叫。注意:該方法是全域性函式,引數是類的名稱。
11. __sleep() / __wakup()
略。
魔術常量:
1. __LINE__
返回檔案中的當前行號。
2. __FILE__
返回所在檔案的完整路徑。
3. __FUNCTION__
返回所在函式名稱。
4. __CLASS__
返回所在類的名稱。
5. __METHOD__
返回所在類方法的名稱。需要注意__METHOD__返回的是"class::function"的形式,而__FUNCTION__則返回"function"的形式。