PHP 5.4正式版重要新特性

來源:互聯網
上載者:User
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 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://graph.facebook.com/'.$url));

  }

  }

  $facebook = new Facebook_API();

  echo $facebook->get('500058753')->name; //這裡會調用API輸出該facebook的使用者名稱

  /** 示範php 5.4中的新特性 */

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

  $foo = 'get';

  echo (new Facebook_API)->$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)->$foo('500058753')->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以及內建調試伺服器,UTF-8預設支援等,詳細的新特性介紹請參考PHP 5.4的使用者手冊。
  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.