首頁  >  文章  >  後端開發  >  PHP 5.4正式版重要新特性

PHP 5.4正式版重要新特性

巴扎黑
巴扎黑原創
2016-11-23 13:26:451130瀏覽

PHP一直是在Web開發領域中十分重要且快速方便的開發語言,深受廣大開發人員的青睞。現在PHP 5.4的正式版本已經發布,其中增加了大量新的特性,官方聲稱性能提高20%,並且佔用更少的資源。在本文中,我將帶領大家學習PHP 5.4的一些新的特性。

  在PHP 5.4中,首先是修復了多達100多處的bug,並且在內存及性能優化上做的更好了,而且去掉了一些之前版本的方法,比如register_globals,magic_quotes,safe_mode等,而且要注意的是,PHP 5.4中,預設的編碼方式已經改變為UTF-8了,這很有利於開發者開發多語言的版本應用。 

  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 包裝特徵*/ 

  trait cURL 
 柯) 

  { 

  $ch = curl_init(); 

  curl_setopt($ch, CURLOPT_URL, $url); 1); 

  $output = curl_exec($ch); 

  curl_close($ch); 

  return $output; 

  } 


  { 

  use cURL; //呼叫Traits 

  public function get ($url) 

  { 

  return json_decode($this->curl('http://api.twitter.com/'.$url)); 『 & */ 

  class Facebook_API 

  { 

  use cURL; //呼叫Traits 
)
  public fLunction get(craits 🎀) return json_decode($this->curl('http://graph.facebook. com/'.$url)); 

  } 

  } 

  $facebook = new Facebook_API(); 

  $facebook =。 facebook的使用者名稱 

  /**Twitter API 類*/ 

  echo (new Facebook_API)->get('500058753')->name; 🎀 >$foo('500058753')->name; 

  echo (new Twitter_API)->get('1/users/show.json?screen_name=rasmus')->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('500058753')->name; 

  $foo = 'get'; 

  echo (new Facebook_API)-0$oo(
 〜.5


  看到了麼?其中對$foo變數賦值為get,然後在類別中企圖呼叫get方法時,是透過(new Facebook_API)->$foo('500058753')->name;去實現呼叫的。 

我們再舉個例子來說明下Traits的使用,可能這個例子比較簡單,例如以下程式碼: 

 trait Net 

  { 



  } 

  } 

  trait Tuts 

  { 

  public function t   } 

  } 

  class NetTuts 

  { 

  use TutsSuts; plus() 

  { 

  return '+'; 

  } 
 < >net(), $o->tuts(), $o-> plus(); 

  echo (new NetTuts)->net(), (new NetTuts)->tuts(), (new NetTuts)->plus(); 



uts〜uts都是以上的結果都輸出。此外,順便說下,在php 5.4中traits的魔術常數為__TRAIT__。 

  內建的調試伺服器 

  在以往的php 開發中,一般是需要跟如Apache HTTP Server進行配合開發的。在php 5.4中,新內建了一個簡單的Web伺服器,以方便開發者不用透過複雜的設定也可以完成開發工作。以下分步驟說明如何在windows環境下,使用php 5.4中的內建伺服器完成相關工作。

  步驟1) 首先在c盤根目錄下建立一個目錄,為public_html,並且在檔案中建立一個router.php文件,程式碼如下: 

// router.php 
if (// router.php 
if (pregmatch(' #.php$#', $_SERVER['REQUEST_URI'])) 

require basename($_SERVER['REQUEST_URI']); // serve php file 

else if (strpos)(QUE_DVERRIS]RIE(D:D:E:(D)」 ], '.') !== false) 

return false; // serve file as-is 

?> 





 如下: 

 // index.php 

  echo 'Hello Nettuts+ Readers!'; 

  ?> 
ude.
include_path = ".;C:phpPEAR;C:public_html" 



  步驟2 運行內建的web伺服器 

  首先進行命令列模式下,並且進入php目錄,輸入如下指令: 
8080 -t C:public_html router.php 
  其中這裡指定了任何機器都可以訪問這台伺服器,並且指定了8080端口,指定了工作監聽的路由文件為c:public_html下的router,php文件,在上面的命令列輸入後按回車,會出現以下資訊提示 

  則證明內建的伺服器已經正確啟動了。 

  這時候,可以在瀏覽器中輸入http://localhost:8080/index.php進行存取了。

  較簡潔的陣列語法 

  在php 5.4中,對一些語法上的支援更顯得簡潔,例如陣列中的聲明,現在 

  uit ('apples', 'oranges', 'bananas'); // 舊的陳述方式 

  $fruits = ['apples', 'oranges', 'bananas']; //php 5.4中新的支援宣告方式
  // 新的關聯數組訪問 

  $array = [ 

  'foo' => 'bar', 
 〜、〜];


  當然,在php 5.4中,同樣支援舊的數組聲明方式。 

  直接對函數回傳值進行陣列取值 

  在php 5.4中,支援直接對函數回傳值進行陣列取值。看個例子,例如: 

 $tmp = explode(' ', 'Alan Mathison Turing'); 

  echo $tmp[1]; // Mathison 

   上面的字串中的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']]; 

 } oo'o'ooo'of'barooo'of'bar's[ooo];輸出Hello 




  閉包中能使用$this指針 

  以前的php 版本中,是不能在匿名方法中(也稱為閉包)使用$this指針的,而php 5.4中是不能在匿名方法中(也可以了範例如下: 

class Foo 

  { 

  function hello() { 

  echo〜 Nettuts!'; onymous() 

  { 

  return function() { 

  $this- >hello(); //這在先前的版本中是不能實現 

  }; 

  } 

  } __construct(Foo $o) 

  { 

  $x = $o->anonymous(); // 實際上呼叫Foo::hello() 

  $x(); // 執行的是Foo::hello() 

  } 🎀 ); //輸出Hello Nettuts! 

  以上的實作方法有點複雜,在php 5.4中,可以更方便寫為如下: 

  function anonymous(
  return function () use ($that) { 

  $that->hello(); 

  }; 

  } 
㟎中的short_tag標記如何設置,在模板中可以隨時使用這樣的方式了,從而代替這樣的方式。採用「0b」字首標識二進制數,現在,如果要使用二進制數,請在前面加上0b的前綴,例如: 

  echo 0b11111 

  函數類型提示的增強型 %在php 5.0後,引入了函數類型提示的功能,其意義為對於傳入函數中的參數都進行型別檢查,舉個例子,有以下的類別: 

 class bar { 

  } 
bar $foo) { 

  } 

  其中函數foo中的參數規定了傳入的參數必須為bar類別的實例,否則系統會判斷出錯。同樣對陣列來說,也可以進行判斷,例如: 

 function foo(array $foo) { 

  } 

  foo(array(1, 2, 3)); // 2, 3); // 2, 3));

  foo(123); // 不正確,傳入的不是數組 




   而在php 5.4中,則支援對callable類型的支援。在以前, 我們如果希望一個函數接受一個回調函數作為參數, 那需要做很多額外的工作來檢查是否是可調用的正確的回調函數,例子如下: 

 function foo(callable $callback) { 

  }

  則: 



  則: 



  foo("false"); //錯誤,因為false不是callable類型 

『foo("printfuncfoo("printf

  class A { 

  static function 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中比較明顯的特性改進主要是Traits以及內建調試伺服器,UTF-8預設支援等,詳細的新特性介紹請參考PHP 5.4的使用手冊。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn