技術交流

Oracle與PHP5 Web 開發 PHP5新特性簡介(上篇)

蘭江濤 蘭江濤

前面介紹了 Web 應用程式的運行環境和開發工具,這次我們來討論開發所用的語言PHP。

什麼是 PHP

PHP(Hypertext Preprocessor,超文本預處理器的字母縮寫)是一種被廣泛應用的開放源代碼的多用途腳本語言,它可嵌入到 HTML中,適合 web 開發。從 1995 年出生以來,跟互聯網一起成長。從當初的 PHP3 到今天的 PHP5.3, 從當初的只是用到個人網站的編寫到今天企業級的應用。

PHP5 於 2004 年 7 月 13 日正式發佈。毫不奇怪,由於 PHP 在 Web 應用程式市場中的領先地位,因此該版本獲得了媒體的廣泛報導。.NET 和 J2EE 等技術確實在曝光率和宣傳報導方面超過 PHP,但易用性、高性能、與 Apache Web 伺服器的緊密集成以及大量應用程式構建塊使 PHP 成為領先的 Web 應用程式開發語言之一。

您可能會問了,既然提供了 Zend Engine 功能的 PHP 4 已經如此成功,為什麼還需要 PHP 5 和 Zend Engine II 呢?事實是,PHP 4 在某些方面並不擅長。這些方面中的大多數對於大型專案和公司(專案管理的結構化程度更高,且系統之間必須具備協同工作的能力)而言更為重要。PHP 5 解決了這些問題,使 PHP 不但對此類項目更具吸引力,而且還仍是 Web 應用程式開發的領先技術。

隨著 PHP 使用範圍的穩步增長,它在較大項目中的使用率也在不斷上升。大型項目好像都使用物件導向 (OO) 的方法。並不是說您不能編寫小型 OO 應用程式,而且即便不使用物件導向的程式設計 (OOP) 方法也完全可以編寫令人印象深刻的大型應用程式。但人們往往在這些情況下選擇 OO 範例,可能是因為 OOP 為功能和技術設計提供更多慣用的工具(UML,統一模組化語言)、為重複出現的問題提供重用解決方案(設計模式)以及 OO 語言本身的內置機制。

PHP 先前版本中的物件模型存在的主要問題是,將物件實現為具有與整數和字串相似的副本語意的自帶類型。這不但會因為 PHP 有時進行的意外隱式物件克隆而導致的某種非常令人混淆的行為,而且使我們無法實現某些基本功能,如取消對方法返回物件的引用的功能。

PHP4 的問題

隱式物件的克隆


class Car {
  var $banner;
  function Car($banner) {
      $this->banner = $banner;
  }// end class constructor
  // Getter/Setter
  function setBanner($banner) {
      $this->banner = $banner;
  }// end setBanner()
  function getBanner() {
      return $this->banner;
  }// end getBanner()
}// end class Car
function lowerCaseBanner($car) {
  $new_banner = strtolower($car->getBanner);
  $car->setBanner($new_banner);
}// end lowerCaseBanner()

// 執行上面的程式
$Car = new Car('BMW');
lowerCaseBanner($Car);
echo $Car->getBanner(); // output ?? -> BMW

輸出的結果可能不是我們想要的,這是因為將物件作為常規自帶類型處理,所以將 $Car 按值傳遞給 lowerCaseBanner()時, lowerCaseBanner() 對 $Car 執行的最終操作在該物件的克隆版本上進行。此行為不但導致令人吃驚的結果,而且對於認識到此問題的開發人員而言,它將需要按引用傳遞和返回物件,由於開發人員必須在許多位置插入&(按引用傳遞、按引用返回和按引用賦值),因此將使代碼的維護更加困難。

無法直接調用返回物件的方法

$obj->getParentObject()->method();

如果您不熟悉 PHP4,則可能認為此示例可以正常運行,但由於前面提到的隱式克隆問題,因此不具有取消對方法返回物件的引用的功能,從而無法實現這一功能。作為變通方法,很多 PHP4 代碼將如下所示:


$temp_obj &= $obj->getParentObject();
$temp_obj->method();

在 PHP5 中,重寫了物件模型的結構使它以物件控制碼運行。除非你使用 clone 關鍵字確切地克隆了一個物件否則你根本不能創建物件的拷貝。在 PHP5 中,不需要傳遞物件的引用或者註冊物件的引用。

PHP5 語言的新特性(New Features)

新的物件導向特性實在太多了,不能在本文作詳細闡述,下面是主要的新特性列表:1.為方法和屬性添加了 public, protected, private 存取權限修飾, 允許使用公共的物件導向存取權限修飾來控制方法和屬性的使用權限。


class Car{
  protected $_banner;

  function __construct ($banner) {
    $this->_banner = $banner;
  }// end class constructor

// Getter/Setter
  public function setBanner($banner) {
    $this->_banner = $banner;
  }// end setBanner()

  public function getBanner() {
    return $this->_banner;
  }// end getBanner()

  function __destructor() {
    //some code here
  }// end __destructor

}// end class Car

2. 統一的建構函數名稱 _construct, 在 PHP4 版本時用的是 class , 如上面的代碼 class Car, 不過 PHP5 仍然相容用 class name 的方式,建議用統一的建構子名稱 __construct

3. 統一的析構函數名稱 _destructor,允許定義一個析構函數當物件崩潰的時候運行。

4. interfaces賦予類具有更多的相互關係。一個類只能從另外一個類中繼承但是可以實現更多的想要的介面。


interface IBase {
        function show();
}// end interface IBase

Class Page implements IBase {
        // 必須要實現介面裡的方法 show()
        function show() {
            echo 'Welcome';
        }// end show()
}

5. 操作符 instanceof,檢查某個變數是否是某個類的實例

6. 不讓別人繼承的類加上關鍵字 final

7. 類中的方法定義成 final 在繼承的類中將不會被繼承

8. 顯式的克隆物件,用關鍵字 clone 來 copy 一個物件。可以 declare 一個 __clone 的方法,當一個物件被拷貝的時候它將執行。


    class Car {
        function __clone() {
            echo "Object is being cloned";
        }
    }
    $Car = new Car();
    clone $Car;

限於篇幅原因,其它新特性將會在下一篇中介紹。

更多有關 PHP 與 Oracle 的消息,請至https://www.oracle.com/technology/tech/php/