重載
php的重載不是嚴格意義上的重載。它是指動態的創建類屬性和方法,這一點是通過魔術方法來實現的。
- 當調用當前環境下未定義或不可見的類屬性或方法時,重載方法會被調用。本節後面將使用不可訪問屬性和不可訪問方法來稱呼這些未定義或不可見的類屬性或方法;
- 屬性重載只能在對象中進行。在靜態方法中,這些魔術方法將不會被調用。所以這些方法都不能被 聲明爲 static。從 PHP 5.3.0 起, 將這些魔術方法定義爲 static 會產生一個警告;
- 在除 isset() 外的其它語言結構中無法使用重載的屬性,這意味着當對一個重載的屬性使用 empty() 時,重載魔術方法將不會被調用。爲避開此限制,必須將重載屬性賦值到本地變量再使用 empty();
- 在對象中調用一個不可訪問方法時,
__call()
會被調用。在靜態上下文中調用一個不可訪問方法時,__callStatic()
會被調用;
魔術方法
__sleep()
&&__wakeup()
:序列化/反序列化時做預備工作只用;__toString()
;__invode()
:當嘗試以函數調用的方式調用一個對象時,會調用該對象的__invoke
方法;__set_state()
:編排var_export時的輸出格式;__debugInfo()
:編排var_dump時的輸出格式;
Final
- PHP 5 新增了一個 final 關鍵字。如果父類中的方法被聲明爲 final,則子類無法覆蓋該方法。如果一個類被聲明爲 final,則不能被繼承;
- 屬性不能被定義爲 final,只有類和方法才能被定義爲 final;
對象複製
- 魔術方法
__clone
用來輔助對象的克隆; - 使用
clone
結構複製對象,實際上是完成對原對象屬性的淺複製,複製成功之後,會調用新對象的__clone
方法,可以在這個方法裏面做一些後處理,達到引用屬性的深複製
對象比較
- 比較符
==
會比較兩個變量所引用的對象的類型(即類名)、屬性、屬性值,如果相同,則認爲相等; - 比較符
===
會比較兩個變量是否引用同一個對象,如果是,則認爲相等;
類型約束
- 類型約束只能針對object、interface、array、callable,無法進行標量(int、string、Traits)約束;
- 如果爲類型約束添加了默認值NULL,那麼可以傳入NULL,這是唯一一種情況;
- 類型約束具有子類繼承性;
後期靜態綁定
- 指的是在程序運行時,靜態方法的主調方綁定到運行時的類(通常是子類),而不是該靜態方法定義的類(通常是父類);
- 使用static關鍵字,代表綁定的類,常用的方法是
static::func_name()
;
對象引用
對象的引用、傳遞、返回(函數回參)使用的都是標識符作爲引用。
序列化
- 序列化/反序列化之前,類必須有定義;
- 序列化只保存類名、屬性名、屬性值,並不會保存方法;