1. 程式人生 > >PHP 5.2、5.3、5.4、5.5、5.6 各版本新功能詳解

PHP 5.2、5.3、5.4、5.5、5.6 各版本新功能詳解

總結

PHP5.2 以前:autoload, PDO 和 MySQLi, 型別約束 PHP5.2:JSON 支援 PHP5.3:棄用的功能,匿名函式,新增魔術方法,名稱空間,後期靜態繫結,Heredoc 和 Nowdoc, const, 三元運算子,Phar PHP5.4:Short Open Tag, 陣列簡寫形式,Traits, 內建 Web 伺服器,細節修改 PHP5.5:yield, list() 用於 foreach, 細節修改 PHP5.6: 常量增強,可變函式引數,名稱空間增強

php5.2以前(2006前)

  1. autoload的使用;當在程式碼中使用一個未定義的類的時候,該函式就會被呼叫 現在已經不再使用了,因為一個專案中只能有一個__autoload();現在使用spl_autoload_register();
  2. PDO和MiSQLi的使用
  3. 型別約束。 通過型別約束可以限制引數的型別,不過這個機制不完善。

php5.2(2006-2011)

(2006-2011) JSON的支援        增加了json_encode(),json_decode()等函式

php5.3(2009-2012)

PHP5.3 算是一個非常大的更新,新增了大量新特徵,同時也做了一些不向下相容的修改

1.棄用的功能 以下幾個功能被棄用,若在配置檔案中啟用,則 PHP 會在執行時發出警告。 Register Globals Magic Quotes Safe Mode

2.匿名函式 func=function(func=function(

arg){ echo $arg; } $func(‘hello’);

3.新增了魔術方法 __invoke(),__callStatic();

隨著匿名函式的加入,PHP 引入了一個新的魔術方法 __invoke().
該魔術方法會在將一個物件作為函式呼叫時被呼叫:
class A
{
    public function __invoke($str)
    {
        print "A::__invoke(): {$str}";
    }
}

$a = new A;
$a("Hello World");
輸出毫無疑問是:  A::__invoke
(): Hello World __callStatic() 則會在呼叫一個不存在的靜態方法時被呼叫。

4.名稱空間,但不完善,只支援類

5.後期靜態繫結

6.Heredoc 和 Nowdoc 對 Heredoc 以及 Nowdoc 進行了一些改進,它們都用於在 PHP 程式碼中嵌入大段字串。

7.用 const 定義常量 PHP5.3 起同時支援在全域性名稱空間和類中使用 const 定義常量。

舊式風格:
define("XOOO", "Value");
新式風格:

const XXOO = "Value";
const 形式僅適用於常量,不適用於執行時才能求值的表示式:
// 正確
const XXOO = 1234;
// 錯誤
const XXOO = 2 * 617;
(5.6版後可以了)

8.三元運算子簡寫形式 舊式風格: echo $a ? $a : “No Value”; 可簡寫成: echo $a ?: “No Value”; 即如果省略三元運算子的第二個部分,會預設用第一個部分代替。

9.Phar Phar即PHP Archive, 起初只是Pear中的一個庫而已,後來在PHP5.3被重新編寫成C擴充套件並內建到 PHP 中。 Phar用來將多個 .php 指令碼打包(也可以打包其他檔案)成一個 .phar 的壓縮檔案(通常是ZIP格式)。 目的在於模仿 Java 的 .jar, 不對,目的是為了讓釋出PHP應用程式更加方便。同時還提供了數字簽名驗證等功能。 .phar 檔案可以像 .php 檔案一樣,被PHP引擎解釋執行,同時你還可以寫出這樣的程式碼來包含(require) .phar 中的程式碼: require(“xxoo.phar”); require(“phar://xxoo.phar/xo/ox.php”); 注:http://www.php.net/manual/zh/phar.using.intro.php

PHP5.4(2012-2013)

1.Short Open Tag 在 PHP5.3 起被預設開啟,在 PHP5.4 起總是可用。 使用這種簡寫形式在 HTML 中嵌入 PHP 變數將會非常方便。 對於純 PHP 檔案(如類實現檔案), PHP 官方建議頂格寫起始標記,同時 省略 結束標記。 這樣可以確保整個 PHP 檔案都是 PHP 程式碼,沒有任何輸出,否則當你包含該檔案後,設定 Header 和 Cookie 時會遇到一些麻煩! 注:Header 和 Cookie 必須在輸出任何內容之前被髮送。

2.陣列簡寫形式

這是非常方便的一項特徵!
// 原來的陣列寫法
$arr = array("key" => "value", "key2" => "value2");
// 簡寫形式
$arr = ["key" => "value", "key2" => "value2"];

3.Traits 所謂Traits就是“構件”,是用來替代繼承的一種機制。PHP中無法進行多重繼承,但一個類可以包含多個Traits.

// Traits不能被單獨例項化,只能被類所包含
trait SayWorld
{
    public function sayHello()
    {
        echo 'World!';
    }
}

class MyHelloWorld
{
    // 將SayWorld中的成員包含進來
    use SayWorld;
}

$xxoo = new MyHelloWorld();
// sayHello() 函式是來自 SayWorld 構件的
$xxoo->sayHello();

Traits還有很多神奇的功能,比如包含多個Traits, 解決衝突,修改訪問
許可權,為函式設定別名等等。
Traits中也同樣可以包含Traits. 篇幅有限不能逐個舉例,詳情參見官網.
http://www.php.net/manual/zh/language.oop5.traits.php

4.內建 Web 伺服器

PHP5.4開始內建一個輕量級的Web伺服器,不支援併發,定位是用於開發和除錯環境。

在開發環境使用它的確非常方便。

php -S localhost:8000
這樣就在當前目錄建立起了一個Web伺服器,你可以通過 http://localhost:8000/ 來訪問。
其中localhost是監聽的ip,8000是監聽的埠,可以自行修改。

很多應用中,都會進行URL重寫,所以PHP提供了一個設定路由指令碼的功能:

php -S localhost:8000 index.php
這樣一來,所有的請求都會由index.php來處理。

你還可以使用 XDebug 來進行斷點除錯。

5.細節修改

PHP5.4 新增了動態訪問靜態方法的方式:
$func = "funcXXOO";
A::{$func}();

新增在例項化時訪問類成員的特徵:
(new MyClass)->xxoo();

新增支援對函式返回陣列的成員訪問解析(這種寫法在之前版本是會報錯的)print func()[0];

PHP5.5(2013起)

1.yield 生成器可以用於大檔案處理

yield關鍵字用於當函式需要返回一個迭代器的時候, 逐個返回值。
function number10()
{
    for($i = 1; $i <= 10; $i += 1)
        yield $i;
}
該函式的返回值是一個數組:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

2.list() 用於 foreach

$array = [
    [1, 2, 3],
    [4, 5, 6],
];
foreach ($array as list($a, $b, $c))
    echo "{$a} {$b} {$c}\n";

3.細節修改 不推薦使用 mysql 函式,推薦使用 PDO 或 MySQLi。 不再支援Windows XP. 可用 MyClass::class 取到一個類的完整限定名(包括名稱空間)。 empty() 支援表示式作為引數。 try-catch 結構新增 finally 塊。

PHP5.6

1.常量增強

定義常量時允許使用之前定義的常量進行計算:
const A = 2;
const B = A + 1;

class C
{
    const STR = "hello";
    const STR2 = self::STR + ", world";
}

允許常量作為函式引數預設值:
function func($arg = C::STR2)

2.可變函式引數

用於代替 func_get_args()

function add(...$args)
{
    $result = 0;
    foreach($args as $arg)
        $result += $arg;
    return $result;
}

同時可以在呼叫函式時,把陣列展開為函式引數:
$arr = [2, 3];
add(1, ...$arr);
// 結果為 6

3.名稱空間增強

名稱空間支援常量和函式:

namespace Name\Space {
    const FOO = 42;
    function f() { echo __FUNCTION__."\n"; }
}

namespace {
    use const Name\Space\FOO;
    use function Name\Space\f;

    echo FOO."\n";
    f();
}