PHP 5 引入了新的對象模型(Object Model)。完全重寫了 PHP 處理對象的方式,允許更佳性能和更多特性。
一、基本概念
1、class
每個類的定義都以關鍵字 class 開頭,後面跟著類名,可以是任何非 PHP 保留字的名字。後面跟著一對花括號,裡面包含有類成員和方法的定義。偽變量 $this 可以在當一個方法在對象內部調用時使用。$this 是一個到調用對象(通常是方法所屬於的對象,但也可以是另一個對象,如果該方法是從第二個對象內靜態調用的話)的引用。看下面例子:
Example#1 面向對象語言中的 $this 變量
- <?php
- class A
- {
- function foo()
- {
- if (isset($this)) {
- echo '$this is defined (';
- echo get_class($this);
- echo ")n";
- } else {
- echo "$this is not defined.n";
- }
- }
- }
- class B
- {
- function bar()
- {
- A::foo();
- }
- }
- $a = new A();
- $a->foo();
- A::foo();
- $b = new B();
- $b->bar();
- B::bar();
- ?>
上例將輸出:
- $this is defined (a)
- $this is not defined.
- $this is defined (b)
- $this is not defined.
Example#2 簡單的類定義
- <?php
- class SimpleClass
- {
- // 成員聲明
- public $var = 'a default value';
- // 方法聲明
- public function displayVar() {
- echo $this->var;
- }
- }
- ?>
Example#3 類成員的默認值
- <?php
- class SimpleClass
- {
- // 無效的類成員定義:
- public $var1 = 'hello '.'world';
- public $var2 = <<<EOD
- hello world
- EOD;
- public $var3 = 1+2;
- public $var4 = self::myStaticMethod();
- public $var5 = $myVar;
- // 正確的類成員定義:
- public $var6 = myConstant;
- public $var7 = self::classConstant;
- public $var8 = array(true, false);
- }
- ?>
2、new
要創建一個對象的實例,必須創建一個新對象並將其賦給一個變量。當創建新對象時該對象總是被賦值,除非該對象定義了構造函數並且在出錯時拋出了一個異常。
Example#4 創建一個實例
- <?php
- $instance = new SimpleClass();
- ?>
復制代碼當把一個對象已經創建的實例賦給一個新變量時,新變量會訪問同一個實例,就和用該對象賦值一樣。此行為和給函數傳遞入實例時一樣。可以用克隆給一個已創建的對象建立一個新實例。
Example#5 對象賦值
- <?php
- $assigned = $instance;
- $reference =& $instance;
- $instance->var = '$assigned will have this value';
- $instance = null; // $instance and $reference become null
- var_dump($instance);
- var_dump($reference);
- var_dump($assigned);
- ?>
復制代碼上例將輸出:
- NULL
- NULL
- object(SimpleClass)#1 (1) {
- ["var"]=>
- string(30) "$assigned will have this value"
- }
3、extends
一個類可以在聲明中用 extends 關鍵字繼承另一個類的方法和成員。不能擴展多個類,只能繼承一個基類。
被繼承的方法和成員可以通過用同樣的名字重新聲明被覆蓋,除非父類定義方法時使用了 final 關鍵字。可以通過 parent:: 來訪問被覆蓋的方法或成員。
Example#6 簡單的類繼承
- <?php
- class ExtendClass extends SimpleClass
- {
- // Redefine the parent method
- function displayVar()
- {
- echo "Extending classn";
- parent::displayVar();
- }
- }
- $extended = new ExtendClass();
- $extended->displayVar();
- ?>
上例將輸出:
- Extending class
- a default value
1