PHP物件導向

來源:互聯網
上載者:User

標籤: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物件導向

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.