[PHP] 面向對象

1. 類、屬性和操作


1.1 類的結構

一個最簡單的類定義如下:

class classname {
}

爲了使類具有實用性,需要添加一些屬性和操作。通過在類中使用關鍵詞來聲明變量,可以創建屬性,這些關鍵詞與變量的作用域相關:public、private和protected,例如:

class classname {
  public $attribute;
}

通過在類定義中聲明函數,可以創建類的操作,例如:

class classname {
  public function operation() {
  }
}


1.2 構造函數與析構函數

大多數類都有構造函數與析構函數。當創建一個類時,它將調用構造函數,通常,這將執行一些初始化任務。與構造函數相對的是析構函數,析構函數允許在銷燬一個類前執行一些操作或完成一些功能。構造函數名稱必須是__construct(),析構函數名稱必須是__destruct(),例如:

class classname {
  function __construct() {
  }
  function __destruct() {
  }
}


1.3 類的實例化

在聲明一個類後,需要創建一個對象,這叫創建一個實例或實例化一個類。可以使用new來創建一個對象,例如:

class classname {
  function __construct() {
  }
}
$i = new classname();


1.4 使用類屬性

在一個類中,可以訪問一個特殊的指針$this,在類中通過一個操作設置或訪問該變量時,可以使用$this->attribute來引用,例如:

class classname {
  public $attribute;
  function operation() {
    echo $this->attribute;
  }
}

是否可以在類的外部訪問一個屬性是由訪問修飾符來確定。public的屬性可以從類的外部直接訪問,例如:

class classname {
  public $attribute;
}
$i = new classname();
$i->attribute = "Hello World";

可以通過__get()和__set()函數來實現對屬性的訪問,如果不直接訪問一個類的屬性而是編寫訪問函數,那麼可以通過一段代碼執行所有訪問,例如:

class classname {
  public $attribute;
  function __get($name) {
    return $this->name;
  }
  function __set($name, $value) {
    $this->name = $value;
  }
}

如果使用$i->attribute=1,將間接調用__set()函數,__get()函數的工作原理類似。只有一個訪問入口,就可以實現對要保存的數據進行檢查,確保被保存的數據是有意義的數據。


1.5 訪問控制

PHP提供了訪問修飾符,它們可以控制屬性和方法的可見性,通常放置在屬性和方法聲明之前。

1) 默認選項是public,意味着如果沒有爲一個屬性或方法指定訪問修飾符,它將是public。公有的屬性和方法可以在類的內部和外部進行訪問。

2) private訪問修飾符意味着被標記的屬性和方法只能在類的內部進行訪問。

3) protected訪問修飾符意味着被標記的屬性或方法只能在類內部進行訪問,它也存在於任何子類。


1.6 類操作的調用

與調用屬性大體相同,可以使用同樣方法調用類的操作,例如:

class classname {
  function operation() {
  }
}
$i = new classname();
$i->operation();


2. 繼承和重載


2.1 實現繼承

如果類是另一個類的子類,可以用關鍵詞extends來指明其繼承關係,例如:

class B extends A {
}

因爲類B派生於類A,所有可以使用類A中聲明的public或protected的操作和屬性。作爲A的子類,B具有與A一樣的功能和數據。private指定的操作和屬性不能被繼承。

繼承是單方向的,子類可以從父類或超類繼承特性,但父類不能從子類繼承特性。


2.2 重載

在子類中,再次聲明相同的屬性和操作也是有效的,我們可能需要在子類中給某個屬性賦予一個與其超類屬性不同的默認值,或者給某個操作賦予一個與其超類操作不同的功能,這就叫重載,例如:

class A {
  function operation() {
  }
}
class B extends A {
  function operation() {
  }
}

parent關鍵字允許調用父類操作的最初版本,但是PHP將使用當前類的屬性值。


2.3 禁止繼承

PHP提供了final關鍵字,當在一個函數聲明前使用這個關鍵字時,這個函數將不能在任何子類中被重載,例如:

final class classname {
}


2.4 實現接口

如果需要實現多重繼承功能,可以通過接口。接口的思想是指定一個實現了訪接口的類必須實現的一系列函數,例如:

interface interfacename {
  function operation();
}
class classname implements interfacename {
  function operation() {
  }
}


3. 面向對象的高級功能


3.1 per-class常量

PHP提供了per-class常量的思想,這個常理可以在不需要初始化訪類的情況下使用,例如:

class classname {
  const c = 1;
}
echo classname::c;


3.2 實現靜態方法

PHP允許使用static關鍵字,該關鍵字適用於允許在未初始化類的情況下就可以調用的方法,等價於per-class常量的思想。在一個靜態方法中,不能使用this關鍵字,因爲可能會沒有可以引用的對象實例。


3.3 檢查類的類型

instanceof關鍵字允許檢查一個對象的類型,可以檢查一個對象是否是特定類的實例,是否是從某個類繼承過來或是是否實現了某個接口。


3.4 延遲靜態綁定

PHP5.3引入了延遲靜態綁定,該特性允許在一個靜態繼承的上下文中對一個被調用類的引用,父類可以使用子類重載的靜態方法。


3.5 克隆對象

PHP提供了clone關鍵字,該關鍵字允許複製一個已有的對象,例如:

$c = clone $i;

clone將創建與原有對象相同類的副本,而且具有相同的屬性值。如果不需要克隆過來的默認行爲,心須在基類中創建一個__clone()方法。當使用clone關鍵字時,該方法將被調用,在__clone()方法中,可以定義所需要的確切複製行爲。


3.6 使用抽象類

PHP還提供了抽象類,這些類不能被實例化,同樣類方法也沒有實現,只是提供類方法的聲明,例如:

abstract class A {
  abstract function operation($param);
}


3.7 使用__call()

__call()方法用來實現方法的重載,它必須帶有兩個參數,第一個包含了被調用的方法名稱,被二個包含了傳遞給該方法的參數數組,例如:

public function __call($method, $p) {
  if ($method == 'test') {
    $this->display('test', $p[0], $p[1]);
  }
}


3.8 使用__autoload()

__autoload()不是一個類方法,而是個單獨的函數,可以在任何類聲明之外聲明這個函數,如果實現了這個函數,它將在實例化一個還沒有被聲明的類時自動調用。

function __autoload($name) {
  include_once $name.'php';
}


3.9 將類轉換成字符串

如果在實定義中實現了__string()函數,當嘗試打印該類時,可以調用這個函數。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章