最近在用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