- 相關推薦
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 創建一個實例
復制代碼當把一個對象已經創建的實例賦給一個新變量時,新變量會訪問同一個實例,就和用該對象賦值一樣。此行為和給函數傳遞入實例時一樣?梢杂每寺〗o一個已創建的對象建立一個新實例。
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 中,不再需要這樣了?梢远x一個 __autoload 函數,它會在試圖使用尚未被定義的類時自動調用。通過調用此函數,腳本引擎在 PHP 出錯失敗前有了最后一個機會加載所需的類。
Note: 在 __autoload 函數中拋出的異常不能被 catch 語句塊捕獲并導致致命錯誤。如果使用 PHP 的 CLI 交互模式 時,Autoloading 不存在。
Example#1 Autoload 例子(本例嘗試分別從 MyClass1.php 和 MyClass2.php 文件中加載 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(); ?>
【PHP新手之學習類與對象】相關文章:
php學習筆記:類的聲明與對象實例化05-14
PHP面向對象的進階學習09-06
PHP編程:類和對象、方法調用09-26
PHP面向對象程序設計之接口用法07-08
新手怎么入門PHP07-03
Python中的類與對象之描述符05-17
PHP對象Object的概念詳解09-05
Python中的類與對象之描述符解析08-11
php面向對象的程序設計10-12