網站首頁 語言 會計 網際網路計算機 醫學 學歷 職場 文藝體育 範文
當前位置:學識谷 > 計算機 > php語言

PHP新手之學習類與物件

欄目: php語言 / 釋出於: / 人氣:4.21K

對於PHP程式設計語言來說,每個人的學習方式不同。下面是小編分享的PHP新手之學習類與物件,歡迎大家參考!

PHP新手之學習類與物件

 一、基本概念

1、class

每個類的定義都以關鍵字 class 開頭,後面跟著類名,可以是任何非 PHP 保留字的名字。後面跟著一對花括號,裡面包含有類成員和方法的定義。偽變數 $this 可以在當一個方法在物件內部呼叫時使用。$this 是一個到呼叫物件(通常是方法所屬於的物件,但也可以是另一個物件,如果該方法是從第二個物件內靜態呼叫的話)的引用。看下面例子:

Example#1 面嚮物件語言中的 $this 變數

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 簡單的類定義

var; } } ?>

Example#3 類成員的預設值

2、new

要建立一個物件的例項,必須建立一個新物件並將其賦給一個變數。當建立新物件時該物件總是被賦值,除非該物件定義了建構函式並且在出錯時丟擲了一個異常。

Example#4 建立一個例項

複製程式碼當把一個物件已經建立的例項賦給一個新變數時,新變數會訪問同一個例項,就和用該物件賦值一樣。此行為和給函式傳遞入例項時一樣。可以用克隆給一個已建立的物件建立一個新例項。

Example#5 物件賦值

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 簡單的類繼承

displayVar(); ?>

上例將輸出:

Extending class a default value

 二、自動載入物件

很多開發者寫面向物件的應用程式時對每個類的定義建立一個 PHP 原始檔。一個很大的煩惱是不得不在每個指令碼(每個類一個檔案)開頭寫一個長長的包含檔案列表

在 PHP 5 中,不再需要這樣了。可以定義一個 __autoload 函式,它會在試圖使用尚未被定義的類時自動呼叫。通過呼叫此函式,指令碼引擎在 PHP 出錯失敗前有了最後一個機會載入所需的類。

Note: 在 __autoload 函式中丟擲的異常不能被 catch 語句塊捕獲並導致致命錯誤。如果使用 PHP 的 CLI 互動模式 時,Autoloading 不存在。

Example#1 Autoload 例子(本例嘗試分別從 和 檔案中載入 MyClass1 和 MyClass2 類。)

 三、建構函式和解構函式

1、建構函式

void __construct ([ mixed $args [, $... ]] )

PHP 5 允行開發者在一個類中定義一個方法作為建構函式。具有建構函式的類會在每次建立物件時先呼叫此方法,所以非常適合在使用物件之前做一些初始化工作。

Note: 如果子類中定義了建構函式則不會暗中呼叫其父類的建構函式。要執行父類的建構函式,需要在子類的建構函式中呼叫 parent::__construct()。

Example#1 使用新標準的建構函式

複製程式碼為了實現向後相容性,如果 PHP 5 在類中找不到 __construct() 函式,它就會嘗試尋找舊式的`建構函式,也就是和類同名的函式。因此唯一會產生相容性問題的情況是:類中已有一個名為 __construct() 的方法,但它卻又不是建構函式。

2、解構函式

void __destruct ( void )

PHP 5 引入了解構函式的概念,這類似於其它面向物件的語言,如 C++。解構函式會在到某個物件的所有引用都被刪除或者當物件被顯式銷燬時執行。

Example#2 解構函式示例

name = "MyDestructableClass"; } function __destruct() { print "Destroying " . $this->name . ""; } } $obj = new MyDestructableClass(); ?>

複製程式碼和建構函式一樣,父類的解構函式不會被引擎暗中呼叫。要執行父類的解構函式,必須在子類的解構函式體中顯式呼叫 parent::__destruct()。

Note: 解構函式在指令碼關閉時呼叫,此時所有的頭資訊已經發出。試圖在解構函式中丟擲一個異常會導致致命錯誤。

四、訪問控制

對屬性或方法的訪問控制,是通過在前面新增關鍵字 public、protected 或 private 來實現的。由 public 所定義的類成員可以在任何地方被訪問;由 protected 所定義的類成員則可以被其所在類的子類和父類訪問(當然,該成員所在的類也可以訪問);而由 private 定義的類成員則只能被其所在類訪問。

1、對類成員的訪問控制

類成員都必須使用關鍵字public、protected 或 private 進行定義

Example#1 宣告類成員

public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // 這行能被正常執行 echo $obj->protected; // 這行會產生一個致命錯誤 echo $obj->private; // 這行也會產生一個致命錯誤 $obj->printHello(); // 輸出 Public、Protected 和 Private /** * Define MyClass2 */ class MyClass2 extends MyClass { // 可以對 public 和 protected 進行重定義,但 private 而不能 protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj->public; // 這行能被正常執行 echo $obj2->private; // 未定義 private echo $obj2->protected; // 這行會產生一個致命錯誤 $obj2->printHello(); // 輸出 Public、Protected2,但不會輸出 Private class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic"; } private function testPrivate() { echo "Bar::testPrivate"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic"; } private function testPrivate() { echo "Foo::testPrivate"; } } $myFoo = new foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>

Note: 為了相容性考慮,在 PHP 4 中使用 var 關鍵字對變數進行定義的方法在 PHP 5 中仍然有效(只是作為 public 關鍵字的一個別名)。在 PHP 5.1.3 之前的版本,該語法會產生一個 E_STRICT 警告。

2、對方法的訪問控制

類中的方法都必須使用關鍵字public、protected 或 private 進行定義。如果沒有設定這些關鍵字,則該方法會被設定成預設的 public。

Example#2 宣告類中的方法

MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // 這行能被正常執行 $myclass->MyProtected(); // 這行會產生一個致命錯誤 $myclass->MyPrivate(); // 這行會產生一個致命錯誤 $myclass->Foo(); // Public、Protected 和 Private 都被呼叫了 /** * Define MyClass2 */ class MyClass2 extends MyClass { // This is public function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // 這行會產生一個致命錯誤 } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // 這行能被正常執行 $myclass2->Foo2(); // Public 和 Protected 都被呼叫了,但 Private 不會被呼叫 ?>

五、範圍解析操作符(::)

範圍解析操作符(也可稱作 Paamayim Nekudotayim)或者更簡單地說是一對冒號,可以用於訪問靜態成員、方法和常量,還可以用於覆蓋類中的成員和方法。

當在類的外部訪問這些靜態成員、方法和常量時,必須使用類的名字。

把 Paamayim Nekudotayim 選作該操作符的名字似乎有些奇怪。然而,這是 Zend 開發小組在寫 Zend Engine 0.5 (被用於 PHP 3 中)時所作出的決定。事實上這個詞在希伯萊文就是雙冒號的意思。

Example#1 在類的外部使用 :: 操作符

self 和 parent 這兩個特殊的關鍵字是用於在類的內部對成員或方法進行訪問的。

Example#2 :: from inside the class definition

當一個子類覆蓋其父類中的方法時,PHP 不會再執行父類中已被覆蓋的方法,直到子類中呼叫這些方法為止。這種機制也作用於 建構函式和解構函式、過載 及 魔術 函式。

Example#3 呼叫父類的方法

myFunc(); ?>

Tags:PHP 學習