程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> Php5.0說明------為面向對象而生的php5

Php5.0說明------為面向對象而生的php5

編輯:關於PHP編程

Php5.0說明 ------為面向對象而生的php5 為面向對象而生的PHP5 --------------------------------------------- [摘要]目前開發中的PHP5,其面向對象的機能已經被大幅度的強化了。下一代的PHP將會是怎樣的一種語言呢?下面我們來詳細講解一下目前發布的PHP5的beta release。 (一) Zend 2.0的誕生 現在的PHP4所使用的基本文法是被稱之為Zend 引擎的腳本編譯引擎。這個就是PHP4的優良機能的原因之一,是作為對PHP3的改進而生成的一種語言。大家一直認為,PHP4的性能根據當初的目標,比PHP3有了很大的提升,在網絡編程的世界裡占據了很大的份額。 開發了Zend 引擎的Zend公司是在開發PHP4的同時,由PHP3的主要開發者Zeev Suraski和Andi Gutmans所創立的企業合並而來的。Zend的名稱是由Zeev和Andi的名字合起來組成的。Zend公司的商業模式是,持續不斷的為open source提供zend 引擎的PHP內核 (core),同時提升周邊產品開發和販賣的利益。以open source software作為基盤的商業,在世界范圍內大多數正在苦戰的企業中,算是比較好的典型例子了。 ■PHP4的局限 托PHP4成功的福,這個用途的適用范圍逐漸變廣起來。作為企業級的用途而使用PHP的說法時有所聞。因此,就有了這樣一個問題,構築大規模網站的時候,代碼的再利用性十分差。具體來說就是,PHP4的面向對象性能很弱,因此習慣於使用Java等的技術人員對此有很多的抱怨。 逐步的改善PHP4的面向對象的性能,大幅度的更改基本文法,開發者達成了更新PHP記述方法的開拓目的。 ■Zend 2.0開始開發 隨後,Zend公司PHP中心的開發者們在2001年7月發表了作為下一代PHP語言引擎的Zend 2.0引擎的構想。以[Zend Engine version 2.0: Feature Overview and Design] (http://www.zend.com/engine2/ZendEngine-2.0.pdf)作為目標的同時,面向對象的性能大幅度的強化了。 目前的PHP4 Zend 引擎的擴張情況與昔日的PHP3如出一轍。這就意味著,要提升新的語言引擎的主版本號,明確方法目標,迎接來自開發團體的稱贊。 Ze2的開發,與以往的Zend引擎一樣,都是運行在open source的模式下的。最新的源代碼在CVS上被全面的公開,因為是面向開放的開發者的,關於開發的議論非常的活躍。 現在Ze2被決定采用於PHP的下一個版本PHP5中。最終發布的時間現在還未定,但是假如根據Zend公司2003年4月1日發布的Newsletter的話,現在的應該就是Beta Release了。 (二) PHP5的新特性 接下來請按照順序看一下被強化的PHP5的性能。首先是最為重要的面向對象性能,類的實體特性在大幅度的被修改著。這裡說的僅是關於類的新特性。 · 對象的參照過渡是默認的(default) · 引入訪問屬性的限制 · 引入訪問方法的限制 · 抽象類和抽象方法 · 接口 · final聲明 · 名空間 · 類內常量 · 類變量 · 統一構建器 · 析構函數(Distructor) · 其他附屬特性 以上內容是根據2003年4月22日CVS上登錄版本資料所寫的,在正式的發布之前,也有變動的可能性。 ■對象的默認參照過渡 在PHP4中,在以變量$var1為類的實體對象的時候,如果$var2 = $var1;那麼,在$var2中,$var1的復制被代入。明顯的,$var2為了指向與$var1相同的對象,就要寫成$var2 =& $var1,必須要加上&作為參照。 而在PHP5,對象的代入將成為自動的參照過渡。也就是說, $var2=$var1,兩者指向相同的對象。如果想要同php4一樣,帶入copy,那麼就會運用到導入__clone()的方法。 $var2 = $var1->__clone();此處,clone前面是兩個連續的“_” (這僅僅是類的實體的特性) ■引入訪問屬性的限制 在PHP4的類中,連同屬性和方法在內,可以自由的訪問類的內外任何地方,而沒有限制。因此,用戶就無法防范屬性的無意中的更改。 而在PHP5中,同C++和Java一樣,導入了private, protected, public三個等級的訪問限制,使得類的設計者能夠對屬性和方法的使用方法進行限定。以下是各種訪問限制的意思。 · Public: 可以自由的在類的內外任何地方進行參照、變更 · Private: 只能在這個類的方法中進行參照、變更 · Protected:能夠在這個類以及繼承了這個類的另一個類的方法中進行參照、變更。另外,在繼承的類中,能夠寫入訪問指定。 在PHP4中的“var”,同以往一樣與public有著相同的意思。下面就來舉一個例子,讓我們來看看訪問限制是怎樣起作用的。 PHP代碼:-------------------------------------------------------------------------------- class Hoge1 {  private $var1 = A;  protected $var2 = B;  protected $var3 = C;  function setLower() {   $this->var1 = a;   $this->var2 = b;   $this->var3 = c;  }  function var1() {   return $this->var1;  }  function var2() {   return $this->var2;  }  function var3() {   return $this->var3;  } } -------------------------------------------------------------------------------- 在這個類中,帶有$var1, $var2, $var3三個屬性。$var1被聲明為private, $var2和$var3是protected.在此處 PHP代碼:-------------------------------------------------------------------------------- $hoge=new Hoge1; echo’var1:’.$hoge->var1.” n” -------------------------------------------------------------------------------- 如果嘗試參照不允許從外部進行訪問的private屬性,那麼就會出現如下錯誤: Fatal error: Cannot access private property hoge1::$var1 in /path/to/script.php on line XX 對於protected的$var2也是相同的。 但是,因為$hoge的方法是沒有private和protected的,所以下面的代碼能夠正常運作,返回內部私有和保護變量的值。 PHP代碼:-------------------------------------------------------------------------------- echo var1: . $hoge->var1() . " "; // var1: A echo var2: . $hoge->var2() . " "; // var2: B echo var3: . $hoge->var3() . " "; // var3: C $hoge->setLower(); echo var1: . $hoge->var1() . " "; // var1: a echo var2: . $hoge->var2() . " "; // var2: b echo var3: . $hoge->var3() . " "; // var3: c -------------------------------------------------------------------------------- 其次,為了能夠看到protected的屬性的狀態,我們試著創造了繼承了Hoge1的類Hoge2 PHP代碼:-------------------------------------------------------------------------------- class Hoge2 extends Hoge1 {  public $var3 = 3;  function d_var1() {   return $this->var1;  }  function d_var2() {   return $this->var2;  }  function d_var3() {   return $this->var3;  } } -------------------------------------------------------------------------------- 在類Hoge2中,只有$var3被聲明為public。在屬性是protected的情況下,從子類進行訪問有何種限制,是由子類的屬性聲明決定的。在Hoge2中,因為$var3被聲明是public,因此無論是從何處都可以訪問Hoge2的$var3(實體是Hoge1的$var3)。因為$var1在Hoge1中是private,因此,在Hoge2子類中Hoge1的$var1不會被繼承,而在Hoge2中有可能會做出名為$var1的屬性,因此,必須要明確區分Hoge1::$var1和Hoge2::$var1。 PHP代碼:-------------------------------------------------------------------------------- $hoge = new Hoge2; echo var1: . $hoge->var1 . " ";   // var1: // echo var2: . $hoge->var2 . " ";  // Error echo var3: . $hoge->var3 . " ";   // var3: 3 echo var1: . $hoge->d_var1() . " "; // var1: echo var2: . $hoge->d_var2() . " "; // var2: B echo var3: . $hoge->d_var3() . " "; // var3: 3 -------------------------------------------------------------------------------- $hoge->var1是與Hoge1::var1沒有關系的變量,因此不會有任何顯示,因為var2有protected訪問限制,所以如果不通過method就直接參照$var2,就會出現致命錯誤。 ■引入訪問方法的限制 與上述相同,此處也分為private, protected, public三種。 · Public: 能夠從任何地方調用 · Private: 只能夠從這個類的method內調用 · Protected: 只能夠從這個類以及subclass的method中調用 此處的意思同Java和C++相同,請不要搞混。 ■抽象(abstract)的類和抽象的方法 支持與Java相同的抽象類和抽象方法。抽象方法只提供了方法名的調用方式,而沒有提供實體。另外,持有抽象方法的類,必須抽象宣言類本身。如果想要直接作成抽象類的對象,那麼就會出現如下的致命錯誤。 Fatal error: Cannot instantiate abstract class ClassName 產生錯誤的實際的例子如下所示: PHP代碼:-------------------------------------------------------------------------------- abstract class MyAbstract {  abstract public function test();  public function test2() {   echo "MyAbstract::test2() called. ";  } } class MyImplement extends MyAbstract {  public function test() {   echo "MyImplement::test() called. ";  } } $obj = new MyImplement; $obj->test(); ?> -------------------------------------------------------------------------------- ■接口(interface) 支持與Java相同的接口(interface)。接口是適合所描述的外部調用形式而設計組合起來的。 接口的實體不能夠記錄。相反的,實現接口的類必須持有與這個接口的方法相對應的實體。另外,類能夠實現多個接口,因此,有可能實現多重繼承。 PHP代碼:-------------------------------------------------------------

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved