物件導向程式設計 ( OOP )

Object Oriented Programming

物件、類、實例、抽象、構造器、方法、屬性

類是物件的抽象

注意:

基本上所有物件導向的程式開發語言都會內建一個 Object 類作為根類,但是 PHP 沒有。

物件導向:物件 = 資料 + 作用於這些資料上的操作 ( 演算法 )

類也是一種資料類型

物件導向程式設計的優點:

  1. 可重用性
  2. 易於維護、更新和升級

物件導向程式設計的三個基本特徵:

  1. 封裝性
  2. 繼承性
  3. 多態性
  4. 抽向性

傳統程式開發是以功能模組為主流程,物件導向是以資料為中心,而不是以服務 ( 功能 ) 為中心。

物件導向將過程和資料結構捆綁在一起,使一個物件操作自己的資料。

物件導向和結構化程式設計最大的區別:

  1. 物件導向設計關心的是要處理的資料
  2. 結構化程式設計關心的是功能

不是任何時候都適合用物件導向程式設計:
如果僅僅是一次或很少的重覆呼叫,建議還是使用結構化程式設計的方式開發,這時結構化程式會比較有效率。

存取限定符:

  1. public ( 預設 )
  2. private
  3. protected

只對類裡面的屬性、方法有用
對 PHP 的類沒有用,在 PHP 中類是共用的

常數:

const ABC
$obj::ABC

靜態方法:( 不用實例化,可執行靜態方法 )

public static function abc()
$obj::abc()

靜態屬性: ( 不用實例化,靜態屬性可變 )

static $abc
$obj::$abc
OBJ::$abc  //不實例化,直接使用類名
self::$abc //實例化,在物件內
static::$abc //後期靜態綁定

參考自身:

$this

建構子:

__construct

或與類同名,當 2 者皆有時,以 __construct 為建構子。
建構子可以有參數,也可以沒有參數。

解構子:

__destruct

繼承時,使用父類別的建構子或解構子:

parent::__construct();
parent::__destruct();

方法參數的類型提示:
參數可使用類型提示,也稱為嚴格資料類型或類型約束。如果存取時參數類型不匹配,會導致錯誤。
目前僅支援類、介面和陣列來作為約束參數的類型,不支援 Integer 、Float、String、Boolean等類型。

class Foo
{
    public function method_a(OtherClass $otherclass)
    {
        //do something
    }
}

多態 ( Polymorphism ) 以下兩種方式都被稱為「多態」。

多載 ( OverLoad ):
一個類中有兩個方法具有相同的方法名稱,但具有不同的參數列表。

覆載 ( OverRide ):
繼承類別時,重新撰寫一個父類別的方法,由於方法名稱和父類別的方法名稱相同,會直接覆蓋。

介面:( interface )

  1. 介面一定是 public 存取控制級別。
  2. 宣告時,不需要寫入詳細方法,只要宣告介面方法名稱。
  3. 有類別 implements 介面時,一定要寫入該介面的方法,否則執行錯誤。
  4. 可以一定實現多個介面。
  5. 介面可以合併,或稱「介面繼承」。

抽向類別:( abstract )

  1. 定義的方法沒有陳述式,但不需要全部。
  2. 只要該類裡面有一個抽象方法,該類就是抽像類。
  3. 抽象類無法直接 new,一定要先被繼承。
根據物件導向程式設計的規範:
一個物件處理一項工作,而若一項「任務」需要多個工作「組合」而成的話,勢必需要有「一個物件」來掌管這些工作的「順序」、「流程」。