PHP 5.5 將會帶回哪些新特徵

來源:互聯網
上載者:User
PHP 5.5 將會帶來哪些新特徵?

2013-01-25

?

PHP 5.4是 在四個月前發布的,現在來看PHP下一個版本似乎早了點,但筆者還是想給大家透露一下PHP5.5 將會帶來哪些新特徵。注意一點:PHP5.5 還在早期的開發階段,所以沒有人知道最終的結果是什麼樣的。所有筆者在這裡談論的也都只是提案。就是說,不是所有下面列出的新特徵都一定會加入 PHP5.5。

  所以,不要太興奮 :)

  新特性和提案列表都相當的大,而且不是按重要性排序。所以,如果你不想通讀一遍的話,這裡有四個特點筆者個人是最興奮的:

  一個簡單的密碼散列API、標量類型提示、Getter和Setter、產生器

  現在,就讓我們來看看PHP5.5 可能會新增哪些功能:

  1.  一、不再向後相容首先,我們將有兩個變化:

      1、放棄對Windows XP和2003 的支援:HP5.5 將不再支援Windows XP和2003,這些系統已經有十年的曆史,所以PHP將不再提供支援。

       2、棄用e修飾符:e修飾符是指示 preg_replace 函數用來評估替換字串作為PHP代碼,而不只是僅僅做一個簡單的字串替換。不出所料,這種行為會源源不斷的出現安全問題。這就是為什麼在PHP5.5 中使用這個修飾符將拋出一個棄用警告。作為替代,你應該使用 preg_replace_callback 函數。你可以從 RFC 找到更多關於這個變化相應的資訊。

  2. 二、新增函數和類

    接下來,我們將看到在計劃之中的新增函數和類:

      1、boolval()

      PHP已經實現了strval、intval和floatval的函數。為了達到一致性將添加boolval函數。它完全可以作為一個布爾值計算,也可以作為一個回呼函數。

      2、hash_pbkdf2()

      PBKDF2全稱“Password-Based Key Derivation Function 2”,正如它的名字一樣,是一種從密碼派生出加密金鑰的演算法。這就需要密碼編譯演算法,也可以用於對密碼雜湊。更廣泛的說明和用法樣本,請參閱 RFC。

      3、intl 擴充

       將有許多改進 intl的擴充。例如,將會有新的 IntlCalendar,IntlGregorianCalendar,IntlTimeZone,IntlBreakIterator,IntlRuleBasedBreakIterator,IntlCodePointBreakIterator 類。之前,我竟然不知道有這麼多關於intl擴充,如果你想知道更多,我建議你去最新公告裡找Calendar和 BreakIterator。

      4、array_column()

      有一個提議,新增array_column(或array_pluck)函數,它的表現如下:

      $userNames = array_column($users, 'name');

      // is the same as

      $userNames = [];

      foreach ($users as $user) {

      $userNames[] = $user['name'];

      }

      像這樣從資料庫擷取一列,但返回是數組。

      5、一個簡單的密碼散列API

      最近的密碼泄漏(從LinkedIn等)顯示,即使是大型網站也不知道如何正確地散列密碼。幾年前人們一直提倡使用bcrypt,但大多數人似乎仍然是使用完全不安全的sha1雜湊值。

      我們認為這樣做的原因可能是真的很難使用crypt函數的API。因此我們會採用一個新的、簡單的API,用於安全的密碼散列:

      $password = "foo";

      // creating the hash

      $hash = password_hash($password, PASSWORD_BCRYPT);

      // verifying a password

      if (password_verify($password, $hash)) {

      // password correct!

      } else {

      // password wrong!

      }

      新的散列API提供了一些更多的特性,請參閱 RFC。

  3. 三、語言改變

    現在真正有趣的東西:新的語言特性和增強功能。

      1、常量引用

      “常量引用”意味著數組可以直接操作字串和數組字面值。舉兩個例子:

      function randomHexString($length) {

      $str = '';

      for ($i = 0; $i < $length; ++$i) {

      $str .= "0123456789abcdef"[mt_rand(0, 15)]; // direct dereference of string

      }

      }

      function randomBool() {

      return [false, true][mt_rand(0, 1)]; // direct dereference of array

      }

      我不認為在實踐中會使用此功能,但它使語言更加一致。請參閱 RFC。

      2、調用empty()函數(和其他運算式)一起工作

      目前,empty()語言構造只能用在變數,而不能在其他運算式。在特定的代碼像empty($this->getFriends())將會拋出一個錯誤。作為PHP5.5 這將成為有效代碼。更多資訊請參閱 RFC。

    ? ? 3、擷取完整類別名稱

      PHP5.3 中引入命名空間的別名類和命名空間短版本的功能。雖然這並不適用於字串類名稱:

      use Some\Deeply\Nested\Namespace\FooBar;

      // does not work, because this will try to use the global `FooBar` class

      $reflection = new ReflectionClass('FooBar');

      為瞭解決這個問題採用新的FooBar::class文法,它返回類的完整類別名稱:

      use Some\Deeply\Nested\Namespace\FooBar;

      // this works because FooBar::class is resolved to "Some\\Deeply\\Nested\\Namespace\\FooBar"

      $reflection = new ReflectionClass(FooBar::class);

      更多樣本請參閱 RFC。

      4、參數跳躍

      如果你有一個函數接受多個可選的參數,目前沒有辦法只改變最後一個參數,而讓其他所有參數為預設值。

      RFC上的例子,如果你有一個函數如下:

      function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... }

      那麼有沒有辦法設定$report_errors=false,而其他兩個為預設值。為瞭解決這個跳躍參數的問題而提出:

      create_query("deleted=0", "name", default, default, false);

      我個人不是特別喜歡這個提議。在我的眼睛裡,代碼需要這個功能,只是設計不當。函數不應該有12個選擇性參數。

      5、標量類型提示

      標量類型提示原本計划進入5.4,但由於缺乏共識而沒有做。擷取更多關於為什麼標量類型提示沒有做進PHP的資訊,請參閱: 標量類型提示比你認為的更難。

      對於PHP5.5 而言,針對標量類型提示討論又一次出現,我認為這是一個相當不錯的 提議。

      它需要通過輸入值來指定類型。例如:123,123.0,“123”都是一個有效int參數輸入,但“hello world”就不是。這與內建函式的行為一致。

      function foo(int $i) { ... }

      foo(1); // $i = 1

      foo(1.0); // $i = 1

      foo("1"); // $i = 1

      foo("1abc"); // not yet clear, maybe $i = 1 with notice

      foo(1.5); // not yet clear, maybe $i = 1 with notice

      foo([]); // error

      foo("abc"); // error

      Getter 和 Setter

      如果你從不喜歡寫這些getXYZ()和setXYZ($value)方法,那麼這應該是你最受歡迎的改變。提議添加一個新的文法來定義一個屬性的設定/讀取:

      class TimePeriod {

      public $seconds;

      public $hours {

      get { return $this->seconds / 3600; }

      set { $this->seconds = $value * 3600; }

      }

      }

      $timePeriod = new TimePeriod;

      $timePeriod->hours = 10;

      var_dump($timePeriod->seconds); // int(36000)

      var_dump($timePeriod->hours); // int(10)

      當然還有更多的功能,比如唯讀屬性。如果你想要知道更多,請參閱 RFC。

      6、產生器

      目前,自訂迭代器很少使用,因為它們的實現,需要大量的樣板代碼。產生器解決這個問題,並提供了一種簡單的樣板代碼來建立迭代器。

      例如,你可以定義一個範圍函數作為迭代器:

      function *xrange($start, $end, $step = 1) {

      for ($i = $start; $i < $end; $i += $step) {

      yield $i;

      }

      }

      foreach (xrange(10, 20) as $i) {

      // ...

      }

      上述xrange函數具有與內建函數相同的行為,但有一點區別:不是返回一個數組的所有值,而是返回一個迭代器動態產生的值。

      擷取更深入的介紹請參閱 RFC。

      7、列表解析和產生器運算式

      列表解析提供一個簡單的方法對數組進行小規模操作:

      $firstNames = [foreach ($users as $user) yield $user->firstName];

      上述列表解析相等於下面的代碼:

      $firstNames = [];

      foreach ($users as $user) {

      $firstNames[] = $user->firstName;

      }

      也可以這樣過濾數組:

      $underageUsers = [foreach ($users as $user) if ($user->age < 18) yield $user];

      產生器運算式也很類似,但是返回一個迭代器(用於動態產生值)而不是一個數組。

      擷取更多的例子請查看 郵件清單中的公告。

      結束語

      正如你所看到的,有很多很棒的新特徵將加入到PHP5.5中。不過,正如筆者所說的,PHP5.5還在早期的開發階段,因此我們不確定上述新特徵是否都會加入。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.