標籤:stat cte 父類 寫入 繼承 可變 isset 速度 否則
1. 記憶體結構;在邏輯上記憶體可以分成四段:棧空間段、堆空間段、資料區段、程式碼片段;
棧空間段空間小,CPU訪問速度快,特點是後進先出。常用來儲存一些佔用長度固定、佔用空間小的資料類型的記憶體段。如一些整形、浮點型等;
對空間段空間大小並不固定,可以動態擴張或者縮減,用於存放長度可變或者佔用記憶體比較大的資料,如字串、數組、對象;
資料區段用來存放已經初始化的全域變數,即程式靜態分配的變數;
程式碼片段用來存放操作指令,也是可執行檔在記憶體中的鏡像。
棧記憶體的空間是可以被程式直接存取的,而堆記憶體的空間不可以直接存取,而是通過將堆記憶體的地址存放到棧記憶體中,通過引用棧記憶體中的地址來存取堆記憶體。
2. PHP中的類通過class關鍵字聲明,並通過new關鍵字執行個體化;
成員屬性需要用var來聲明,如果指定public、private、protected等,則不需要使用var;
成員函數通過function聲明;
對象通過->來訪問成員方法和屬性;
3. PHP中$this 代表當前對象,self代表當前類,parent代表父類;
4. 構造方法:function __construct(){}定義一個構造方法,以供在執行個體化時調用;
析構方法:PHP中的析構由記憶體回收機制完成,function __destruct(){}定義的析構方法僅僅是在析構時會自動調用,而沒有任何析構作用;
5. 封裝性:private使屬性或者方法在類定義之外不可調用,protected使屬性或者方法在類定義或者子類定義之外不可調用,public使屬性或者方法在任何地方調用;
6. __set()、__get()方法:PHP中的__set()、__get()有稍許不同,並不是對每一個屬性單獨調用,而是在__set()方法中完成所有可能傳入的屬性的set或者相關處理等過程,__set()方法定義時傳入兩個參數,分別為傳入的屬性和將要賦予的值,__get()方法類似,傳入一個屬性名稱來擷取;__set()、__get()方法在對象使用時和其他語言一樣,可以到達直接存取或者賦值的效果;
7. __isset()、__unset()方法:這兩個方法中的內容將作為對對象的屬性進行isset()、unset()函數操作時調用的真正方法;
8. PHP不支援多重繼承,百度了好幾個PHP多重繼承的實現,都是通過介面等操作來實現,並不是真正的多重繼承,與此同時,不存在多重繼承帶來的繼承順序的問題;
9. 方法支援被重載,但是如果在類之前或者方法之前加上final關鍵字,那麼這個類將不能被繼承,這個方法不能被重載;
10. 通過static關鍵字聲明類的靜態成員或者靜態方法,通過MyClass::$var,以及 MyClass::foo()的形式調用靜態變數以及靜態方法;
11. 單態設計模式:使得一個類只能執行個體化一個變數,避免例如執行個體化多個對象對資料庫進行多次串連引起的消耗。具體實現是定義一個靜態私人變數$obj,初始化為null,並且將構造方法私人化,在另外一個靜態方法getInstance()中調用判斷類的靜態私人變數self::$obj(也是類的唯一對象)是否為null,如果是的話就調用構造方法,並賦值給self::$obj,如果不是,則直接返回self::$obj對象;該特殊類在執行個體化時,需要通過靜態方法MyClass::getInstance()來執行個體化;
12. 類中的一些關鍵字:
const關鍵字可以在類中定義一個常量,並且是靜態;
instanceof關鍵字可以判斷一個對象是否是一個類的執行個體: $obj isinstanceof MyClass,並得到布爾值;
clone關鍵字可以複製一個對象,並且通過實現__clone()方法,可以對clone操作進行重定義;
13. 類中的通用方法:
__toString(),和python中的__str__()方法同,在echo中會調用;
__call(),和python中__call__()區別,而是類似於ruby中的幽靈方法(method_missing())。不是使對象可調用化,而是在對象調用方法不存在時,自動執行__call()方法中的內容,通過__call()方法的實現,可以在調用的方法不存在時做出一些反應,如將方法名轉成小寫調用等等;
書上使用了__call()方法實現了一個連貫操作的功能,這應該是目前在《細說PHP》見過最酷的黑科技了:
14. 類的自動載入,PHP中提供了一個__autoload()全域函數,當在php指令碼中使用一個未知類時,會嘗試在目前的目錄下include一個xxx.class.php或者之類的檔案,其實現方式類似於:
function __autoload($classname){
include(strtolower($classname).”class.php");
}
15. 對象序列化,通過serialize()函數將一個對象序列化成二進位串,以便寫入到檔案或者資料庫,或者傳輸到網路中;
通過unserialize()函數可以對讀取的對象經行解串操作,恢複成對象之前的結構;
通過定義__sleep()方法可以自訂在序列化時的操作,通過返回一個數組自訂需要被序列化的屬性,但是方法會被保留;
通過定義__wakeup()方法來定義在解串過程中,對序列化時可能丟失的屬性進行定義;
16. 抽象類別和介面:
通過abstract 關鍵字,定義一個抽象類別: abstract class ,在抽象類別中,可以定義抽象方法: abstract function();
繼承自抽象類別的類必須完成所有抽象方法,否則還是一個抽象類別,並且必須以abstract聲明;
通過interface 關鍵字,定義一個介面:interface MyClass;通過implements來實現介面的方法,同樣的,必須實現介面中的全部方法,否則還是一個抽象類別;
抽象類別和介面不能執行個體化對象;
17. 多態:PHP中的多態通過實現一個相同的介面來實現。
PHP物件導向