PHP的class與其他語言有很多不同點。PHP允許很奇葩的在靜態方法中調用實例方法,提供了關鍵字self和static用於訪問類自身的靜態成員。self永遠是指當前的類,而static則可能會變成指向派生類,這也是比較奇葩的地方,靜態成員是可以繼承和覆蓋的。
PHP還提供了一些以雙下劃線開頭的魔術方法(包括構造方法和一些內置的“接口”),下面即是PHP現有的魔法方法:
1、__construct($args) 和 __destruct(void)
即構造方法和析構方法,與其他語言相同,在實例化時調用構造方法,在回收對象時調用析構方法。析構方法可用於在執行結束後自動回收資源,像關閉一些以指針引用的資源。
2、mixed __call (string $name
, array $arguments
) 和 mixed __callStatic (string $name
, array $arguments
)
如果調用一個對象中不存在的方法或類中不存在靜態方法,就會分別調用上面兩個方法。這兩個方法使得你可以使用一些特別的動態運行機制,讓方法無中生有。個人建議盡量少用,它們會讓代碼難以維護,並且無法被IDE支持。
3、mixed __get (string $name
) 和 __set (string $name , mixed $value)
跟__call一樣,它們是在調用不存在的屬性時候被執行,同樣建議少用。
4、bool __isset (string $name
) 和 __unset (string $name
)
當對對象不存在的屬性調用 isset() 或 empty() 時,__isset() 會被調用。__unset則是在調用unset時被調用。
5、array __sleep (void) 和 __wakeup (void)
這兩個方法會分別在序列化之前和序列化之後調用,可用於整理將序列化的對象的屬性和在序列化之後恢復狀態。
6、string __toString (void)
它告訴PHP在需要將對象轉換為字符串時應該如何轉換,像 echo new MyClass();
7、mixed __invoke ()
在把一個對象變量當成函數來調用時會調用這個方法。
8、object __set_state (array $properties
)
在對一個對象調用var_export()時它將被調用,並以返回值代替對象自身,可以讓它來組織導出變量的數據。
9、__clone()
用這個方法允許我們在復制對象的同時也為屬性進行深拷貝,類似.net中的ICloneable接口。
關於自動加載:
PHP自身沒有自動加載的機制,但是新版本中提供了spl_autoload_register這個函數來注冊一個函數,在使用一個不存在的類時被注冊的函數即被調用,開發者需要手工在函數中實現加載機制。筆者沒深入了解過include的機制,如果還需要檢測一個文件是否存在,可能會讓運行效率變低。