PHP 5.4正式版重要新特性
PHP一直是在Web開發領域中十分重要而快捷方便的開發語言,深受廣大開發人員的青睞。現在PHP 5.4的正式版本已經發布,其中增加了大量新的特性,官方聲稱性能提高20%,並且佔用更少的資源。在本文中,我將帶領大家學習PHP 5.4的一些新的特性。
在PHP 5.4中,首先是修復了多達100多處的bug,並且在內存及性能優化上做的更好了,而且去掉了一些之前版本的方法,比如register_globals,magic_quotes,safe_mode等,而且要注意的是,PHP 5.4中,默認的編碼方式已經改變爲了,這很有利於開發者開發多語言的版本應用。
Traits介紹
首先來介紹下PHP 5.4中新加入的功能Traits。其實該功能在其他語言中也見到其蹤影,這裏可以簡單理解爲一系列的方法的集合,在組織結構上跟類有點象(但不能象類那樣實例化),能讓開發者可以在不同的類中重用這組方法。由於php是單繼承的語言,所以一個類中是不能同時繼承多個類的。這個時候,Traits就派上用場了。
Traits是一個方案集合,它不屬於任何實際類。用戶沒法創建Trait實例或直接調用Trait中的方法,相反,用戶必須將Traits合併到實際的類當中方能使用它們。在優先級方面,Trait方法會覆蓋繼承而來的同名方法,而當前合併類中的同名方法則會覆蓋Trait方法。
下面舉個例子來說明Traits的用途。假設我們正在構建的網站中,需要同時調用Facebook和Twitter的API,而在這兩個API的調用過程中,都需要調用curl方法進行一系列的操作,獲得兩者API接口返回的內容,爲了不在這兩個類中重複編寫相同的方法,可以使用php 5.4中的Traits實現,如下代碼所示:
/** cURL wrapper trait */
trait cURL
public function curl($url)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return $output;
/** Twitter API 類 */
class Twitter_API
use cURL; //調用Traits
public function get($url)
return json_decode($this->curl("http://api.twitter.com/".$url));
/** Facebook API 類 */
class Facebook_API
use cURL; //調用Traits
public function get($url)
return json_decode($this->curl("http://www.owjee.com/".$url));
$facebook = new Facebook_API();
echo $facebook->get("name; //這裏會調用API輸出該facebook的用戶名
/** 演示php 5.4中的新特性 */
echo (new Facebook_API)->get("name;
$foo = "get";
echo (new Facebook_API)->$foo("name;
echo (new Twitter_API)->get("name;
在上面的代碼中,首先通過關鍵字trait定義了一個功能集合,其名稱爲Curl,其中包含一個方法名爲curl,該方法中是根據url的參數值,調用php內置的cur方法返回該url對應的頁面輸出內容。然後在Twitter_API類和Facebook_API
類中,分別使用use cURL去調用了這個Traits,並且在各自的get方法中,都調用了Traits中的的curl方法。
注意在上面的代碼中,我們除了用new Facebook_API()來生成facebook對象的實例外,還演示了使用php 5.4中新的特性,即:
可以在實例化時訪問類成員,即:
echo (new Facebook_API)->get("name;
$foo = "get";
echo (new Facebook_API)->$foo("name;
看到了麼?其中對$foo變量賦值爲get,然後在類中企圖調用get方法時,是通過(new Facebook_API)->$foo("500058753")->name;去實現調用的。
我們再舉個例子來說明下Traits的使用,可能這個例子更加簡單,比如如下代碼:
trait Net
public function net()
return "Net";
trait Tuts
public function tuts()
return "Tuts";
class NetTuts
use Net, Tuts;
public function plus()
return "+";
$o = new NetTuts;
echo $o->net(), $o->tuts(), $o->plus();
echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus();
以上的結果都輸出NetTuts。此外,順便說下,在php 5.4中traits的魔術常量爲__TRAIT__。
內置的調試服務器
在以往的php 開發中,一般是需要跟如Apache HTTP Server進行配合開發的。在php 5.4中,新內置了一個簡單的Web服務器,以方便開發者不用通過複雜的配置也可以完成開發工作。下面分步驟講解下如何在windows環境下,使用php 5.4中的內置服務器完成相關工作。
步驟1) 首先在c盤根目錄下建立一個目錄,爲public_html,並且在文件中建立一個router.php文件,代碼如下:
php
// router.php
if (preg_match("#\.php$#", $_SERVER["REQUEST_URI"]))
require basename($_SERVER["REQUEST_URI"]); // serve php file
else if (strpos($_SERVER["REQUEST_URI"], ".") !== false)
return false; // serve file as-is
>
然後再建立一個簡單的PHP文件,名字爲index.php,如下:
// index.php
echo "Hello Nettuts+ Readers!";
>
然後打開php 5.4的安裝目錄,找到php.ini,然後在include_path中加入如下這行:
include_path = ".;C:\php\PEAR;C:\public_html"
步驟2 運行內置的web服務器
首先進行命令行模式下,並且進入php目錄,輸入如下命令:
php -S 0.0.0.0:8080 -t C:\public_html router.php
其中這裏指定了任何機器都可以訪問這臺服務器,並且指定了8080端口,指定了工作監聽的路由文件爲c:\public_html下的router,php文件,在上面的命令行輸入後按回車,會出現如下信息提示
則證明內置的服務器已經正確啓動了。
這個時候,可以在瀏覽器中輸入http://localhost:8080/index.php進行訪問了。
更簡潔的數組語法
在php 5.4中,對一些語法上的支持更加顯得簡潔,比如數組中的聲明,現在
支持使用中括號的方法來聲明,如下:
$fruits = array("apples", "oranges", "bananas"); // 舊的聲明方式
$fruits = ["apples", "oranges", "bananas"]; //php 5.4中新的支持聲明方式
// 新的關聯數組訪問
$array = [
"foo" => "bar",
"bar" => "foo"
];
當然,在php 5.4中,同樣支持舊的數組聲明方式。
直接對函數返回值進行數組取值
在php 5.4中,支持直接對函數返回值進行數組取值。看個例子,比如:
$tmp = explode(" ", "Alan Mathison Turing");
echo $tmp[1]; // Mathison
在這個例子中,如果是php 5.4之前,要取出上面的字符串中的Mathison的話,必須先用explode函數先返回相關的值,然後再對數組進行取值。而在php 5.4中,可以直接對返回值進行數組進行取值,如下:
echo explode(" ", "Alan Mathison Turing")[1];
這樣就方便多了。再比如,加入要獲得上面這個字符串的最後一個字符串部分Turing,在php 5.4中可以這樣做:
echo end(explode(" ", "Alan Mathison Turing"));
再給出一個複雜點的例子,如下:
function foobar()
return ["foo" => ["bar" => "Hello"]];
echo foobar()["foo"]["bar"]; //輸出 Hello
閉包中能使用$this指針
以前的php 版本中,是不能在匿名方法中(也稱爲閉包)使用$this指針的,而php 5.4中是可以了,例子如下:
class Foo
function hello() {
echo "Hello Nettuts!";
function anonymous()
return function() {
$this->hello(); //這在以前的版本中是不能實現
};
class Bar
function __construct(Foo $o)
$x = $o->anonymous(); // 實際上調用Foo::hello()
$x(); // 執行的是 Foo::hello()
new Bar(new Foo); //輸出 Hello Nettuts!
以上的實現方法有點複雜,在php 5.4中,可以更方便寫爲如下:
function anonymous()
$that = $this;
return function() use ($that) {
$that->hello();
};
現在,不管php.ini中的short_tag標記如何設置,在模板中可以隨時使用這樣的方式了,從而代替 這樣的方式。採用“0b”前綴標識二進制數,現在,如果要使用二進制數,請在前面加上0b的前綴,比如:
echo 0b11111
函數類型提示的增強
由於php是弱類型的語言,因此在php 5.0後,引入了函數類型提示的功能,其含義爲對於傳入函數中的參數都進行類型檢查,舉個例子,有如下的類:
class bar {
function foo(bar $foo) {
其中函數foo中的參數規定了傳入的參數必須爲bar類的實例,否則系統會判斷出錯。同樣對於數組來說,也可以進行判斷,比如:
function foo(array $foo) {
foo(array(1, 2, 3)); // 正確,因爲傳入的是數組
foo(123); // 不正確,傳入的不是數組
而在php 5.4中,則支持對callable類型的支持。在以前, 我們如果希望一個函數接受一個回調函數作爲參數, 那需要做很多額外的工作來檢查是否是可調用的正確的回調函數,例子如下:
function foo(callable $callback) {
則:
foo("false"); //錯誤,因爲false不是callable類型
foo("printf"); //正確
foo(function(){}); //正確
class A {
static function show() {
foo(array("A", "show")); //正確
遺憾的是,PHP 5.4中,依然不支持對基本類型如字符,整形等的類型提示。
對時間統計的增強
在PHP 5.4中,其中新增加了$_SERVER["REQUEST_TIME_FLOAT"],這個是用來統計服務請求時間的,並用ms來表示,大大方便了開發者,比如:
echo "腳本執行時間 ", round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), "s";
總結:
本文簡單小結了PHP 5.4中的一些新的特性,可以看到PHP 5.4中比較明顯的特性改進主要是Traits以及內置調試服務器,默認支持等,詳細的新特性介紹請參考PHP 5.4的用戶手冊
來源地址:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0427/10323.html
在PHP 5.4中,首先是修復了多達100多處的bug,並且在內存及性能優化上做的更好了,而且去掉了一些之前版本的方法,比如register_globals,magic_quotes,safe_mode等,而且要注意的是,PHP 5.4中,默認的編碼方式已經改變爲了,這很有利於開發者開發多語言的版本應用。
Traits介紹
首先來介紹下PHP 5.4中新加入的功能Traits。其實該功能在其他語言中也見到其蹤影,這裏可以簡單理解爲一系列的方法的集合,在組織結構上跟類有點象(但不能象類那樣實例化),能讓開發者可以在不同的類中重用這組方法。由於php是單繼承的語言,所以一個類中是不能同時繼承多個類的。這個時候,Traits就派上用場了。
Traits是一個方案集合,它不屬於任何實際類。用戶沒法創建Trait實例或直接調用Trait中的方法,相反,用戶必須將Traits合併到實際的類當中方能使用它們。在優先級方面,Trait方法會覆蓋繼承而來的同名方法,而當前合併類中的同名方法則會覆蓋Trait方法。
下面舉個例子來說明Traits的用途。假設我們正在構建的網站中,需要同時調用Facebook和Twitter的API,而在這兩個API的調用過程中,都需要調用curl方法進行一系列的操作,獲得兩者API接口返回的內容,爲了不在這兩個類中重複編寫相同的方法,可以使用php 5.4中的Traits實現,如下代碼所示:
/** cURL wrapper trait */
trait cURL
public function curl($url)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return $output;
/** Twitter API 類 */
class Twitter_API
use cURL; //調用Traits
public function get($url)
return json_decode($this->curl("http://api.twitter.com/".$url));
/** Facebook API 類 */
class Facebook_API
use cURL; //調用Traits
public function get($url)
return json_decode($this->curl("http://www.owjee.com/".$url));
$facebook = new Facebook_API();
echo $facebook->get("name; //這裏會調用API輸出該facebook的用戶名
/** 演示php 5.4中的新特性 */
echo (new Facebook_API)->get("name;
$foo = "get";
echo (new Facebook_API)->$foo("name;
echo (new Twitter_API)->get("name;
在上面的代碼中,首先通過關鍵字trait定義了一個功能集合,其名稱爲Curl,其中包含一個方法名爲curl,該方法中是根據url的參數值,調用php內置的cur方法返回該url對應的頁面輸出內容。然後在Twitter_API類和Facebook_API
類中,分別使用use cURL去調用了這個Traits,並且在各自的get方法中,都調用了Traits中的的curl方法。
注意在上面的代碼中,我們除了用new Facebook_API()來生成facebook對象的實例外,還演示了使用php 5.4中新的特性,即:
可以在實例化時訪問類成員,即:
echo (new Facebook_API)->get("name;
$foo = "get";
echo (new Facebook_API)->$foo("name;
看到了麼?其中對$foo變量賦值爲get,然後在類中企圖調用get方法時,是通過(new Facebook_API)->$foo("500058753")->name;去實現調用的。
我們再舉個例子來說明下Traits的使用,可能這個例子更加簡單,比如如下代碼:
trait Net
public function net()
return "Net";
trait Tuts
public function tuts()
return "Tuts";
class NetTuts
use Net, Tuts;
public function plus()
return "+";
$o = new NetTuts;
echo $o->net(), $o->tuts(), $o->plus();
echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus();
以上的結果都輸出NetTuts。此外,順便說下,在php 5.4中traits的魔術常量爲__TRAIT__。
內置的調試服務器
在以往的php 開發中,一般是需要跟如Apache HTTP Server進行配合開發的。在php 5.4中,新內置了一個簡單的Web服務器,以方便開發者不用通過複雜的配置也可以完成開發工作。下面分步驟講解下如何在windows環境下,使用php 5.4中的內置服務器完成相關工作。
步驟1) 首先在c盤根目錄下建立一個目錄,爲public_html,並且在文件中建立一個router.php文件,代碼如下:
php
// router.php
if (preg_match("#\.php$#", $_SERVER["REQUEST_URI"]))
require basename($_SERVER["REQUEST_URI"]); // serve php file
else if (strpos($_SERVER["REQUEST_URI"], ".") !== false)
return false; // serve file as-is
>
然後再建立一個簡單的PHP文件,名字爲index.php,如下:
// index.php
echo "Hello Nettuts+ Readers!";
>
然後打開php 5.4的安裝目錄,找到php.ini,然後在include_path中加入如下這行:
include_path = ".;C:\php\PEAR;C:\public_html"
步驟2 運行內置的web服務器
首先進行命令行模式下,並且進入php目錄,輸入如下命令:
php -S 0.0.0.0:8080 -t C:\public_html router.php
其中這裏指定了任何機器都可以訪問這臺服務器,並且指定了8080端口,指定了工作監聽的路由文件爲c:\public_html下的router,php文件,在上面的命令行輸入後按回車,會出現如下信息提示
則證明內置的服務器已經正確啓動了。
這個時候,可以在瀏覽器中輸入http://localhost:8080/index.php進行訪問了。
更簡潔的數組語法
在php 5.4中,對一些語法上的支持更加顯得簡潔,比如數組中的聲明,現在
支持使用中括號的方法來聲明,如下:
$fruits = array("apples", "oranges", "bananas"); // 舊的聲明方式
$fruits = ["apples", "oranges", "bananas"]; //php 5.4中新的支持聲明方式
// 新的關聯數組訪問
$array = [
"foo" => "bar",
"bar" => "foo"
];
當然,在php 5.4中,同樣支持舊的數組聲明方式。
直接對函數返回值進行數組取值
在php 5.4中,支持直接對函數返回值進行數組取值。看個例子,比如:
$tmp = explode(" ", "Alan Mathison Turing");
echo $tmp[1]; // Mathison
在這個例子中,如果是php 5.4之前,要取出上面的字符串中的Mathison的話,必須先用explode函數先返回相關的值,然後再對數組進行取值。而在php 5.4中,可以直接對返回值進行數組進行取值,如下:
echo explode(" ", "Alan Mathison Turing")[1];
這樣就方便多了。再比如,加入要獲得上面這個字符串的最後一個字符串部分Turing,在php 5.4中可以這樣做:
echo end(explode(" ", "Alan Mathison Turing"));
再給出一個複雜點的例子,如下:
function foobar()
return ["foo" => ["bar" => "Hello"]];
echo foobar()["foo"]["bar"]; //輸出 Hello
閉包中能使用$this指針
以前的php 版本中,是不能在匿名方法中(也稱爲閉包)使用$this指針的,而php 5.4中是可以了,例子如下:
class Foo
function hello() {
echo "Hello Nettuts!";
function anonymous()
return function() {
$this->hello(); //這在以前的版本中是不能實現
};
class Bar
function __construct(Foo $o)
$x = $o->anonymous(); // 實際上調用Foo::hello()
$x(); // 執行的是 Foo::hello()
new Bar(new Foo); //輸出 Hello Nettuts!
以上的實現方法有點複雜,在php 5.4中,可以更方便寫爲如下:
function anonymous()
$that = $this;
return function() use ($that) {
$that->hello();
};
現在,不管php.ini中的short_tag標記如何設置,在模板中可以隨時使用這樣的方式了,從而代替 這樣的方式。採用“0b”前綴標識二進制數,現在,如果要使用二進制數,請在前面加上0b的前綴,比如:
echo 0b11111
函數類型提示的增強
由於php是弱類型的語言,因此在php 5.0後,引入了函數類型提示的功能,其含義爲對於傳入函數中的參數都進行類型檢查,舉個例子,有如下的類:
class bar {
function foo(bar $foo) {
其中函數foo中的參數規定了傳入的參數必須爲bar類的實例,否則系統會判斷出錯。同樣對於數組來說,也可以進行判斷,比如:
function foo(array $foo) {
foo(array(1, 2, 3)); // 正確,因爲傳入的是數組
foo(123); // 不正確,傳入的不是數組
而在php 5.4中,則支持對callable類型的支持。在以前, 我們如果希望一個函數接受一個回調函數作爲參數, 那需要做很多額外的工作來檢查是否是可調用的正確的回調函數,例子如下:
function foo(callable $callback) {
則:
foo("false"); //錯誤,因爲false不是callable類型
foo("printf"); //正確
foo(function(){}); //正確
class A {
static function show() {
foo(array("A", "show")); //正確
遺憾的是,PHP 5.4中,依然不支持對基本類型如字符,整形等的類型提示。
對時間統計的增強
在PHP 5.4中,其中新增加了$_SERVER["REQUEST_TIME_FLOAT"],這個是用來統計服務請求時間的,並用ms來表示,大大方便了開發者,比如:
echo "腳本執行時間 ", round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), "s";
總結:
本文簡單小結了PHP 5.4中的一些新的特性,可以看到PHP 5.4中比較明顯的特性改進主要是Traits以及內置調試服務器,默認支持等,詳細的新特性介紹請參考PHP 5.4的用戶手冊
來源地址:http://www.php100.com/html/webkaifa/PHP/PHPyingyong/2012/0427/10323.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.