技術交流

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

蘭江濤 蘭江濤
更新於

上篇我們討論到PHP5的 OOP 特徵,本篇我們繼續上篇的內容介紹及相對於PHP4 版本的其他不同之處。

  • 用 const 關鍵字來定義Class 常量:
    
        class MyClass {
            const SUCCESS = 1; 
            const FAILURE = 0;			
        } // end MyClass
        
        echo MyClass::SUCCESS;
    
  • 靜態成員 (static member)
    
        class MyClass {
            static private $instance = null;			
        } // end MyClass
        
        echo MyClass::SUCCESS;
    
  • 靜態方法(Static Method),如:
    
        class MyClass {
            static function getName() {
                return 'Dennis';
            }
        } // end MyClass
        
        echo MyClass:: getName; // output Dennis
    
  • 抽象類 (Abstract Class):類可以使用 abstract 聲明防止它們被實例化,可以繼承一個抽象類。
    
        abstract class MyClass {
            abstract function getName();
        } // end MyClass
    
  • 抽象方法 (Abstract Method):當從一個抽象類中繼承類延續他們的定義。一個類如果包含一個抽象方法必須用 abstract 聲明。
  • 類類型提示 (Class type hints):如某個方法裡的參數傳的是某個 class 類型,程運行的時候會去檢測所傳的參數是不是 declare 時的 class 的 instance
    
        class MyClass {
            function getName() {
                echo 'Dennis';
            }
        } // end MyClass
        
        function testClassHint(MyClass $myclass) {
            $myclass->getName();
        }
        
        testClassHint(new MyClass());
    
  • 支援從方法中返回非關聯物件,也就是說可以直接調用返回物件的方法
    
    // PHP 4:
    $dummy = $obj->method();
    $dummy->method2();
    
    // PHP 5:
    $obj->method()->method2();
    
  • 疊代Iteration:PHP5 允許 PHP 類和 PHP 擴展類執行一個迭代介面。一旦你執行這個介面,已將可以通過使用 foreach() 語言結構迭代實例化這個類。
  • 自動載入類 __autoload():在 PHP4 時代,為了引用已經寫好的 class,在程式執行之前要 include 或 require 這些個 file. 在 PHP5 中,就不需要這麼做了。你可以定義一個 __autoload() 函數,它將自動調用一個還沒有被定義的類。通過調用這個函數,腳本引擎將在 PHP 拋出一個錯誤之前一直持續嘗試讀取這個類。
    
        function __autoload($class_name) {
            include_once($class_name . 'php');
        }
        
        $obj  = new MyClass1();
        $obj2 = new MyClass2();
    
  • 異常處理 (Exception Handling):PHP5 中添加了 try/throw/catch 語句。來完成異常的處理。您可以自定義自己的Exception(必須要繼承built-in class Exception),來處理程式中的邏輯。
    
        class SQLException extends Exception {
            public $problem;
            function __construct($problem) {
                $this->problem = $problem;
            }
        }
        try {
            //    ...
            throw new SQLException('Could not connect to database');
          //...
        } catch (SQLException $e) {
            print 'Caught an SQLException with problem $obj->problem';
        } catch (Exception $e) {
            print 'Caught unrecognized exception';
        }
    
  • foreach 與引用:在 PHP4 裡,你不能迭代一個陣列和改變它們的值。PHP5 允許你通過使用「&」(引用)標記 foreach() 迴圈來實現,創建任何你改變的值影響你所迭代的陣列。
    
        foreach ($array as &$value) {
            if ($value === 'NULL') {
                $value = NULL; // PHP4 can not change value here
            }
        }
    

其他新功能

  • XML 擴充:在 PHP5 中,所有的 XML 擴展已經被重寫並使用優秀的 libxml2 XML 工具包。
  • SAX:新的 SAX 的實現已經從 Expat 轉到了 libxml2
  • DOM 重寫,符合W3C 標準。
  • 在 PHP4 中,有兩個擴展支持 XSL 轉化。第一個使用 Sablotron 擴展而第二個在 DOM 擴展中使用 XSLT 支持。在 PHP5 中,寫了一個新的 XSL 擴展,它是基於 libxml2 擴展的。由於在 PHP5 中,XSL 轉換不是提取 XSLT 樣式作為一個參數而是依靠 DOM 擴展去讀取它,這個樣式會被存儲到記憶體中,並應用到文檔來節約執行時間。
  • 回顧過去一兩年,我們會很清晰地知道,SimpleXML 已經改變了 PHP 開發者處理 XML 檔的方式。SimpleXML 能夠被真正的叫做XML for Dummies。代替處理 DOM 甚至更糟糕的SAX,SimpleXML 將 XML 檔作為 PHP 物件來描述。你可以讀取、寫入或者使用疊代方便的訪問元素和屬性。
  • PHP4 對 SOAP 的支持不是很好,基本要用 PEAR 的 library. PHP5 做了改進