參考PHP手冊(cè):魔術(shù)方法
1.__construct([ mixed $args
[, $...
]] )
具有構(gòu)造函數(shù)的類會(huì)在每次創(chuàng)建新對(duì)象時(shí)先調(diào)用此方法,用在使用對(duì)象之前做一些初始化工作。
Note:
1.如果子類中定義了構(gòu)造函數(shù)則不會(huì)隱式調(diào)用其父類的構(gòu)造函數(shù)。要執(zhí)行父類的構(gòu)造函數(shù),需要在子類的構(gòu)造函數(shù)中調(diào)用 parent::__construct()。
2.如果子類沒有定義構(gòu)造函數(shù)則會(huì)如同一個(gè)普通的類方法一樣從父類繼承(假如沒有被定義為 private 的話)。
3.可以為構(gòu)造函數(shù)定義任意多個(gè)參數(shù),只要在實(shí)例化時(shí)傳入對(duì)應(yīng)個(gè)數(shù)的參數(shù)即可。構(gòu)造函數(shù)中出現(xiàn)的任何異常都會(huì)阻止對(duì)象的創(chuàng)建。
4.將構(gòu)造函數(shù)聲明為私有方法,可以防止在類外部創(chuàng)建對(duì)象,這在單利模式中經(jīng)常使用。
2.__destruct ( void )
析構(gòu)函數(shù)會(huì)在到某個(gè)對(duì)象的所有引用都被刪除或者當(dāng)對(duì)象被顯式銷毀時(shí)執(zhí)行。
Note:
1.和構(gòu)造函數(shù)一樣,父類的析構(gòu)函數(shù)不會(huì)被引擎暗中調(diào)用。要執(zhí)行父類的析構(gòu)函數(shù),必須在子類的析構(gòu)函數(shù)體中顯式調(diào)用 parent::__destruct()。此外也和構(gòu)造函數(shù)一樣,子類如果自己沒有定義析構(gòu)函數(shù)則會(huì)繼承父類的。
2.析構(gòu)函數(shù)即使在使用exit()
終止腳本運(yùn)行時(shí)也會(huì)被調(diào)用。在析構(gòu)函數(shù)中調(diào)用exit()
將會(huì)中止其余關(guān)閉操作的運(yùn)行。
3.析構(gòu)函數(shù)在腳本關(guān)閉時(shí)調(diào)用,此時(shí)所有的 HTTP 頭信息已經(jīng)發(fā)出。腳本關(guān)閉時(shí)的工作目錄有可能和在 SAPI(如 apache)中時(shí)不同。
4.試圖在析構(gòu) 函數(shù)(在腳本終止時(shí)被調(diào)用)中拋出一個(gè)異常會(huì)導(dǎo)致致命錯(cuò)誤。
PHP所提供的"重載"(overloading)是指動(dòng)態(tài)地"創(chuàng)建"類屬性和方法。我們是通過魔術(shù)方法(magic methods)來實(shí)現(xiàn)的。
3.__call、__callStatic(方法重載)
public mixed __call ( string $name
, array $arguments
)
public static mixed __callStatic ( string $name
, array $arguments
)
在對(duì)象中調(diào)用一個(gè)不可訪問方法時(shí),__call() 會(huì)被調(diào)用。
在靜態(tài)上下文中調(diào)用一個(gè)不可訪問方法時(shí),__callStatic()會(huì)被調(diào)用。
說明:
1.$name 參數(shù)是要調(diào)用的方法名稱。
2.$arguments 參數(shù)是一個(gè)枚舉數(shù)組,包含著要傳遞給方法 $name 的參數(shù)。
3.PHP 5.3.0版本新增 __callStatic()魔術(shù)方法。可見性未設(shè)置為 public 或未聲明為 static 的時(shí)候會(huì)產(chǎn)生一個(gè)警告。
4.__set、__get、__isset、__unset
public void __set ( string $name
, mixed $value
)
在給不可訪問屬性賦值時(shí),__set() 會(huì)被調(diào)用。
public mixed __get ( string $name
)
讀取不可訪問屬性的值時(shí),__get()會(huì)被調(diào)用。
public bool __isset ( string $name
)
當(dāng)對(duì)不可訪問屬性調(diào)用 isset() 或 empty()時(shí),__isset()會(huì)被調(diào)用。
public void __unset ( string $name
)
當(dāng)對(duì)不可訪問屬性調(diào)用 unset()時(shí),__unset() 會(huì)被調(diào)用。
說明:
1.參數(shù)$name
是指要操作的變量名稱。__set()方法的$value
參數(shù)指定了 $name 變量的值。
2.屬性重載只能在對(duì)象中進(jìn)行。在靜態(tài)方法中,這些魔術(shù)方法將不會(huì)被調(diào)用。所以這些方法都不能被 聲明為 static。從 PHP 5.3.0 起, 將這些魔術(shù)方法定義為 static 會(huì)產(chǎn)生一個(gè)警告。
3.PHP 5.3.0 新增 __isset()和 __unset() 兩個(gè)魔術(shù)方法。
Note:
1.因?yàn)?PHP 處理賦值運(yùn)算的方式,__set() 的返回值將被忽略。類似的, 在下面這樣的鏈?zhǔn)劫x值中,__get() 不會(huì)被調(diào)用:$a = $obj->b = 8;
class TestClass
{
private $foo;
public function __set($name, $value){
echo "__set().".$name.".".$value;
}
public function __get($get){
echo "__get({$get})";
}
}
$class = new TestClass();
$a = $class->foo;
$a = $class->foo = 8;
//輸出:
//__get(foo)
//__set().foo.8
Note:
2.在除 isset() 外的其它語言結(jié)構(gòu)中無法使用重載的屬性,這意味著當(dāng)對(duì)一個(gè)重載的屬性使用 empty() 時(shí),重載魔術(shù)方法將不會(huì)被調(diào)用。為避開此限制,必須將重載屬性賦值到本地變量再使用 empty()。(很遺憾,這個(gè)不知道啥意思,如果有人看到,并且知道,深切的懇請(qǐng)告知,Q1563659827,先謝過!(*^__^*)
)
5.__sleep()、__wakeup()
public array __sleep ( void )
方法常用于提交未提交的數(shù)據(jù),或類似的清理操作。同時(shí),如果有一些很大的對(duì)象,但不需要全部保存,這個(gè)功能就很好用。
void __wakeup ( void )
經(jīng)常用在反序列化操作中,例如重新建立數(shù)據(jù)庫(kù)連接,或執(zhí)行其它初始化操作。
6.__toString()
public string __toString ( void )
用于一個(gè)類被當(dāng)成字符串時(shí)應(yīng)怎樣回應(yīng)。例如 echo $obj; 應(yīng)該顯示些什么。此方法必須返回一個(gè)字符串,否則將發(fā)出一條E_RECOVERABLE_ERROR
級(jí)別的致命錯(cuò)誤。
7.__invoke()
mixed __invoke ([ $...
] )
當(dāng)嘗試以調(diào)用函數(shù)的方式調(diào)用一個(gè)對(duì)象時(shí),__invoke()方法會(huì)被自動(dòng)調(diào)用。
Note:
本特性只在 PHP 5.3.0 及以上版本有效。
8.__set_state()
static object __set_state ( array $properties
)
自 PHP 5.1.0 起當(dāng)調(diào)用 var_export() 導(dǎo)出類時(shí),此方法會(huì)被調(diào)用。
本方法的唯一參數(shù)是一個(gè)數(shù)組,其中包含按 array('property' => value, ...) 格式排列的類屬性。
9.__debugInfo
array __debugInfo ( void )
該方法在var_dump()類對(duì)象的時(shí)候被調(diào)用,如果沒有定義該方法,則var_dump會(huì)打印出所有的類屬性
10.__clone()
對(duì)象復(fù)制可以通過 clone 關(guān)鍵字來完成(如果可能,這將調(diào)用對(duì)象的 __clone() 方法)。對(duì)象中的 __clone() 方法不能被直接調(diào)用。
$copy_of_object = clone $object;
當(dāng)對(duì)象被復(fù)制后,PHP 5 會(huì)對(duì)對(duì)象的所有屬性執(zhí)行一個(gè)淺復(fù)制(shallow copy)。所有的引用屬性 仍然會(huì)是一個(gè)指向原來的變量的引用。
void __clone ( void )
當(dāng)復(fù)制完成時(shí),如果定義了 __clone() 方法,則新創(chuàng)建的對(duì)象(復(fù)制生成的對(duì)象)中的 __clone()方法會(huì)被調(diào)用,可用于修改屬性的值(如果有必要的話)。