程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP5.3 新版本中的新特性

PHP5.3 新版本中的新特性

編輯:PHP綜合

PHP5.3 新版本跟隨了很多新特性, 其中比較惹眼的特性之一就是支持了閉包。那麼以後,我們也可以和那幫寫 Ruby、Javascript 等等“高科技語言”的家伙們一樣,寫出非常酷的代碼嗎?呃,其實大部分情況下是可以的,而有些方面還是令人非常的困擾,下面慢慢道來。

很多語言的都提供了非常優雅和漂亮的操作數組的方法。在下面的例子中,會使用 PHP5.3 以及其他語言提供的閉包功能,用於展示如何“客觀的”操作迭代數組。

毫無疑問,如今PHP已經成為WEB開方當中最熱門的技術之一。根據nexen.Net的調查,互聯網上三分之一的網站選擇PHP來開發服務器端程序。在歐美和日本等國家,PHP開發市場呈現出一片欣欣向榮的景象,像Facebook、Yahoo!、Flickr和Sourceforge這樣的知名PHP站點數不勝數。而近年來國內的各大網站也逐漸大量使用PHP。
 
依靠活躍、組織嚴密的開發社區,PHP語言本身一直在穩定地進步--一方面不斷改善性能和穩定性,增加各種實用的開發工具;另一方面積極汲取其它編程語言的優點來充實語言特性。如今的PHP,即可以支持強大的面向對象開發(如Java),又保留了簡單易學的語法(如C),同時,PHP還擁有極其多樣化的各種實用的函數、擴展和類庫,非常方便用於web開發。另外,隨著面向對象開發的逐步普及,各種開源的PHP類庫和開發框架層出不窮。
 
6月底,PHP官方正式發布了PHP5.3.0。這是一個不尋常的PHP版本,因為它修復了不少Bug(超過140個),而且帶來了很多讓PHP程序員們期待已久的新特性。其中有些特性原本是計劃在PHP6中發布的,但因呼聲很高,提前在PHP5.3中發布了。

一.PHP 5.3中的新特性
支持命名空間(Namespace)
毫無疑問,命名空間是PHP5.3所帶來的最重要的新特性。有了命名空間的概念,在開發大型站點時,就比較容易設計出靈活的結構,同時避免不同包中的類名或變量名產生沖突。
在PHP5.3之前,慣例的劃分Package的辦法是通過目錄名來分隔代碼文件,代碼中的類名則用下劃線_來表示目錄。例如


代碼示例: 
class Zend_Db_Table_Select {}
// 表示當前這個類的文件位於Zend/Db/Table/Select目錄下
?> 


這樣的命名方式被PEAR、Zend Framework及各種PHP項目廣泛采用。雖然該方法可以避免不同包或類庫中的類名產生沖突,但在書寫代碼的時候顯得較為麻煩和笨拙。

在PHP5.3中,則只需要指定不同的命名空間即可,命名空間的分隔符為反斜桿。
代碼示例: 
namespace ZendDbTable;
class Select {}
?> 

這樣即使其它命名空間下存在名為Select的類,程序在調用時也不會產生沖突。代碼的可讀性也有所增加。
支持延遲靜態綁定(Late Static Binding)
在PHP5中,我們可以在類中通過self關鍵字或者__CLASS__來判斷或調用當前類。但有一個問題,如果我們是在子類中調用,得到的結果將是父類。因為在繼承父類的時候,靜態成員就已經被綁定了。例如:
代碼示例: 
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        self::who();
    }
}

class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}

B::test();
?> 
以上代碼輸出的結果是:


這和我們的預期不同,我們原來想得到子類的相應結果。

PHP 5.3.0中增加了一個static關鍵字來引用當前類,即實現了延遲靜態綁定:
代碼示例: 
class A {
    public static function who() {
        echo __CLASS__;
    }
    public static function test() {
        static::who(); // 這裡實現了延遲的靜態綁定
    }
}

class B extends A {
    public static function who() {
         echo __CLASS__;
    }
}

B::test();
?> 
以上代碼輸出的結果是:

支持goto語句
多數計算機程序設計語言中都支持無條件轉向語句goto,當程序執行到goto語句時,即轉向由goto語句中的標號指出的程序位置繼續執行。盡管goto語句有可能會導致程序流程不清晰,可讀性減弱,但在某些情況下具有其獨特的方便之處,例如中斷深度嵌套的循環和if語句。
代碼示例: 
goto a;
echo 'Foo';
 
a:
echo 'Bar';

for($i=0,$j=50; $i<100; $i++) {
  while($j--) {
    if($j==17) goto end;
  } 
}
echo "i = $i";
end:
echo 'j hit 17';
?> 

支持閉包、Lambda/Anonymous函數
閉包(Closure)函數和Lambda函數的概念來自於函數編程領域。例如JavaScript 是支持閉包和 lambda 函數的最常見語言之一。
在PHP中,我們也可以通過create_function()在代碼運行時創建函數。但有一個問題:創建的函數僅在運行時才被編譯,而不與其它代碼同時被編譯成執行碼,因此我們無法使用類似APC這樣的執行碼緩存來提高代碼執行效率。
在PHP5.3中,我們可以使用Lambda/匿名函數來定義一些臨時使用(即用即棄型)的函數,以作為array_map()/array_walk()等函數的回調函數。

代碼示例: 
echo preg_replace_callback('~-([a-z])~', function ($match) {
    return strtoupper($match[1]);
}, 'hello-world');
// 輸出 helloWorld
$greet = function($name)
{
    printf("Hello %srn", $name);
};

$greet('World');
$greet('PHP');
//...在某個類中
$callback =      function ($quantity, $product) use ($tax, &$total)         {
   $pricePerItem = constant(__CLASS__ . "::PRICE_" .  strtoupper($product));
   $total += ($pricePerItem * $quantity) * ($tax + 1.0);
 };
array_walk($products, $callback);
?> 

新增兩個魔術方法__callStatic()和__invoke()
PHP中原本有一個魔術方法__call(),當代碼調用對象的某個不存在的方法時該魔術方法會被自動調用。新增的__callStatic()方法則只用於靜態類方法。當嘗試調用類中不存在的靜態方法時,__callStatic()魔術方法將被自動調用。


代碼示例: 
class MethodTest {
    public function __call($name, $arguments) {
        // 參數 $name 大小寫敏感
        echo "調用對象方法 '$name' "
             . implode(' -- ', $arguments). "n";
    }

    /**  PHP 5.3.0 以上版本中本類方法有效  */
    public static function __callStatic($name, $arguments) {
        // 參數 $name 大小寫敏感
        echo "調用靜態方法 '$name' "
             . implode(' -- ', $arguments). "n";
    }
}

$obj = new MethodTest;
$obj->runTest('通過對象調用');

MethodTest::runTest('靜態調用');  // As of PHP 5.3.0
?> 
   以上代碼執行後輸出如下:
   調用對象方法'runTest' –- 通過對象調用
   
調用靜態方法'runTest' –- 靜態調用 


以函數形式來調用對象時,__invoke()方法將被自動調用。

代碼示例: 
class MethodTest {
    public function __call($name, $arguments) {
        // 參數 $name 大小寫敏感
        echo "Calling object method '$name' "
             . implode(', ', $arguments). "n";
    }

    /**  PHP 5.3.0 以上版本中本類方法有效  */
    public static function __callStatic($name, $arguments) {
        // 參數 $name 大小寫敏感
        echo "Calling static method '$name' "
             . implode(', ', $arguments). "n";
    }
}

$obj = new MethodTest;
$obj->runTest('in object context');

MethodTest::runTest('in static context');  // As of PHP 5.3.0
?> 

新增Nowdoc語法,用法和Heredoc類似,但使用單引號。Heredoc則需要通過使用雙引號來聲明。
Nowdoc中不會做任何變量解析,非常適合於傳遞一段PHP代碼。
代碼示例: 
// Nowdoc 單引號PHP 5.3之後支持
$name = 'MyName';

echo <<<'EOT'
My name is "$name". 
EOT;
//上面代碼輸出 My name is "$name". ((其中變量不被解析)
// Heredoc不加引號
echo <<
Hello World!
FOOBAR;
//或者雙引號 PHP 5.3之後支持
echo <<<"FOOBAR"
Hello World!
FOOBAR;
?> 

支持通過Heredoc來初始化靜態變量、類成員和類常量。
代碼示例: 
// 靜態變量
function foo()
{
    static $bar = << Nothing in here...
LABEL;
}

// 類成員、常量
class foo
{
    const BAR = << Constant example
FOOBAR;

    public $baz = << Property example
FOOBAR;
}
?> 

在類外也可使用const來定義常量
PHP中定義常量通常是用這種方式:
代碼示例: 
define("CONSTANT", "Hello world.");
?> 


PHP5.3新增了一種常量定義方式:

代碼示例: 
const CONSTANT = 'Hello World';
?> 

三元運算符增加了一個快捷書寫方式: ?:
原本格式為是(expr1) ? (expr2) : (expr3)
如果expr1結果為True,則返回expr2的結果。
PHP5.3新增一種書寫方式,可以省略中間部分,書寫為expr1 ?: expr3
如果expr1結果為True,則返回expr1的結果
HTTP狀態碼在200-399范圍內均被認為訪問成功
支持動態調用靜態方法
代碼示例: 

class Test
{
    public static function testgo()
    {
         echo "gogo!";
    }
}

$class = 'Test';
$action = 'testgo';
$class::$action();  //輸出 "gogo!"
?> 

支持嵌套處理異常(Exception)
新的垃圾收集器(GC),並默認啟用

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