1. 程式人生 > >php 魔術方法和魔術常量

php 魔術方法和魔術常量

ted 簡單 ech auto trait space esp wak 聲明

魔術方法:

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"的形式。

6.__DIR__

返回文件所在的目錄。如果用在被包括文件中,則返回被包括的文件所在的目錄。它等價於 dirname(__FILE__)。除非是根目錄,否則目錄中名不包括末尾的斜杠。不包含文件名。(PHP 5.3.0中新增) =

7.__NAMESPACE__

當前命名空間的名稱(區分大小寫)。此常量是在編譯時定義的(PHP 5.3.0 新增)。

8.__TRAIT__

Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定義時的名字(區分大小寫)。Trait 名包括其被聲明的作用區域(例如 Foo\Bar)。

php 魔術方法和魔術常量