php不一樣版本特性記錄

最近在用php開發時項目中遇到了版本問題,特此記錄下php不一樣版本的一些特性記錄,以備忘。php

一:php5.3中的新特性編程

1)開始支持命名空間(Namespace)緩存

2)支持延遲靜態綁定(Late Static Binding)閉包

3 ) 支持goto語句編程語言

4)支持閉包、Lambda/Anonymous函數函數式編程

5)新增了兩個魔術方法 __callStatic()和_invoke()函數

6)在類外也可以使用const來定義常量spa

7)支持動態調用靜態方法.net

①在5.3以前,慣例的劃分Package的辦法是經過目錄名來分隔代碼文件的,代碼中的類名則用下劃線(_)來表示目錄 code

<?php 
//用如下的命名方式表示該類文件在Zend/Db/Table/Select目錄下
class Zend_Db_Table_Select{}

      這樣的命名方式被PEAR,以及Zend Framework及一些PHP項目普遍採用,雖然這樣能夠避免類名之間的衝突,但這樣的書寫方式顯得很臃腫。在php5.3中只須要指定不一樣的命名空間就能夠了(注意空間名之間用‘\’進行分隔)。

<?php  
namespace Zend\DB\Table 
class Select{ }

②支持延遲靜態綁定(Late Static Binding) 

       在php5中,咱們能夠在類中經過self關鍵字或者__CLASS__來判斷或調用當前類,但若是咱們在子類中調用,結果倒是父類,由於在繼承父類的時候,靜態成員就已經綁定了,eg:

<?php 
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();
//結果爲A

這顯然和咱們預期的結果不太同樣,咱們但願的結果是B(在繼承父類的時候已經進行了綁定),在PHP5.3中增長了一個static關鍵字來引用當前類,既能夠實現延遲靜態綁定。

<?php 
class A{
    public static function who(){
        echo __CLASS__ ;
    }
    public static function test(){
        // self::who();
        static::who();//這裏用static實現的延遲靜態綁定
    }
}

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

B::test();
//結果爲B

③支持goto語句

大多數的編程語言都支持無條件的轉向語句goto,你可能剛開始學編程的時候老師或者書上就告訴你不要使用goto語句,這樣可能會致使程序流程混亂,可讀性變差,實踐證實這句話是對的,但萬事有例外,某些狀況下goto語句仍是具備其獨特的方便之處的,例如中斷深度嵌套的循壞和if語句

<?php 
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()等函數的回調函數

<?php 

echo preg_replace_callback('/([a-z])/',function($match){
    return strtoupper($match[1]);
},'hello-world');
echo "<br/>";
$greet = function($name){
    printf("Hello%s\r\n",$name);
};

$greet('world');
echo "<br/>";
$greet('PHP');

$callback = function ($quantity,$product) use ($tax,$total){
    $pricePerItem = constant(__CLASS__,"::PRICE".strtoupper($product));
    $total += ($pricePerItem * $quantity) * ($tax + 1.0);
};
array_walk($product,$callback);

關於閉包函數的概念可參考:http://bbs.csdn.net/topics/360002529

相關文章
相關標籤/搜索