一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

PHP5各個版本的新功能和新特性總結(jié)

本文目錄:
php5.2 以前:autoload, PDO 和 MySQLi, 類型約束
php5.2:JSON 支持
php5.3:棄用的功能,匿名函數(shù),新增魔術(shù)方法,命名空間,后期靜態(tài)綁定,Heredoc 和 Nowdoc, const, 三元運算符,Phar
php5.4:Short Open Tag, 數(shù)組簡寫形式,Traits, 內(nèi)置 Web 服務(wù)器,細節(jié)修改
php5.5:yield, list() 用于 foreach, 細節(jié)修改
php5.6: 常量增強,可變函數(shù)參數(shù),命名空間增強

一、php5.2以前(2006前)
順便介紹一下 php5.2 已經(jīng)出現(xiàn)但值得介紹的特征。
autoload
大家可能都知道 __autoload() 函數(shù),如果定義了該函數(shù),那么當在代碼中使用一個未定義的類的時候,該函數(shù)就會被調(diào)用,你可以在該函數(shù)中加載相應(yīng)的類實現(xiàn)文件,如:
復制代碼 代碼如下:function __autoload($classname)
{
    require_once("{$classname}.php")
}
但該函數(shù)已經(jīng)不被建議使用,原因是一個項目中僅能有一個這樣的 __autoload() 函數(shù),因為 php 不允許函數(shù)重名。但當你使用一些類庫的時候,難免會出現(xiàn)多個 autoload 函數(shù)的需要,于是 spl_autoload_register() 取而代之:
復制代碼 代碼如下:spl_autoload_register(function($classname)
{
    require_once("{$classname}.php")
});
spl_autoload_register() 會將一個函數(shù)注冊到 autoload 函數(shù)列表中,當出現(xiàn)未定義的類的時候,SPL [注] 會按照注冊的倒序逐個調(diào)用被注冊的 autoload 函數(shù),這意味著你可以使用 spl_autoload_register() 注冊多個 autoload 函數(shù).
注:SPL: Standard php Library, 標準 php 庫, 被設(shè)計用來解決一些經(jīng)典問題(如數(shù)據(jù)結(jié)構(gòu)).

PDO 和 MySQLi
php Data Object, php 數(shù)據(jù)對象,這是 php 的新式數(shù)據(jù)庫訪問接口。
按照傳統(tǒng)的風格,訪問 MySQL 數(shù)據(jù)庫應(yīng)該是這樣子:
復制代碼 代碼如下:// 連接到服務(wù)器,選擇數(shù)據(jù)庫
$conn = mysql_connect("localhost", "user", "password");
mysql_select_db("database");

// 執(zhí)行 SQL 查詢
$type = $_POST['type'];
$sql = "SELECT * FROM `table` WHERE `type` = {$type}";
$result = mysql_query($sql);

// 打印結(jié)果
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
    foreach($row as $k => $v)
        print "{$k}: {$v}/n";
}

// 釋放結(jié)果集,關(guān)閉連接
mysql_free_result($result);
mysql_close($conn);
為了能夠讓代碼實現(xiàn)數(shù)據(jù)庫無關(guān),即一段代碼同時適用于多種數(shù)據(jù)庫(例如以上代碼僅僅適用于MySQL),php 官方設(shè)計了 PDO.
除此之外,PDO 還提供了更多功能,比如:

1.面向?qū)ο箫L格的接口
2.SQL預編譯(prepare), 占位符語法
3.更高的執(zhí)行效率,作為官方推薦,有特別的性能優(yōu)化
4.支持大部分SQL數(shù)據(jù)庫,更換數(shù)據(jù)庫無需改動代碼

上面的代碼用 PDO 實現(xiàn)將會是這樣:
復制代碼 代碼如下:// 連接到數(shù)據(jù)庫
$conn = new PDO("mysql:host=localhost;dbname=database", "user", "password");

// 預編譯SQL, 綁定參數(shù)
$query = $conn->prepare("SELECT * FROM `table` WHERE `type` = :type");
$query->bindParam("type", $_POST['type']);

// 執(zhí)行查詢并打印結(jié)果
foreach($query->execute() as $row)
{
    foreach($row as $k => $v)
        print "{$k}: {$v}/n";
}
PDO 是官方推薦的,更為通用的數(shù)據(jù)庫訪問方式,如果你沒有特殊需求,那么你最好學習和使用 PDO.
但如果你需要使用 MySQL 所特有的高級功能,那么你可能需要嘗試一下 MySQLi, 因為 PDO 為了能夠同時在多種數(shù)據(jù)庫上使用,不會包含那些 MySQL 獨有的功能。

MySQLi 是 MySQL 的增強接口,同時提供面向過程和面向?qū)ο蠼涌冢彩悄壳巴扑]的 MySQL 驅(qū)動,舊的C風格 MySQL 接口將會在今后被默認關(guān)閉。
MySQLi 的用法和以上兩段代碼相比,沒有太多新概念,在此不再給出示例,可以參見 php 官網(wǎng)文檔 [注]。

注:http://www.php.NET/manual/en/mysqli.quickstart.php

類型約束
通過類型約束可以限制參數(shù)的類型,不過這一機制并不完善,目前僅適用于類和 callable(可執(zhí)行類型) 以及 array(數(shù)組), 不適用于 string 和 int.
復制代碼 代碼如下:// 限制第一個參數(shù)為 MyClass, 第二個參數(shù)為可執(zhí)行類型,第三個參數(shù)為數(shù)組
function MyFunction(MyClass $a, callable $b, array $c)
{
    // ...
}

php5.2(2006-2011):JSON 支持

包括 json_encode(), json_decode() 等函數(shù),JSON 算是在 Web 領(lǐng)域非常常用的數(shù)據(jù)交換格式,可以被 JS 直接支持,JSON 實際上是 JS 語法的一部分。
JSON 系列函數(shù),可以將 php 中的數(shù)組結(jié)構(gòu)與 JSON 字符串進行轉(zhuǎn)換:
復制代碼 代碼如下:$array = ["key" => "value", "array" => [1, 2, 3, 4]];
$json = json_encode($array);
echo "{$json}/n";

$object = json_decode($json);
print_r($object);
輸出:
復制代碼 代碼如下:{"key":"value","array":[1,2,3,4]}
stdClass Object
(
    [key] => value
    [array] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 3
            [3] => 4
        )
)
值得注意的是 json_decode() 默認會返回一個對象而非數(shù)組,如果需要返回數(shù)組需要將第二個參數(shù)設(shè)置為 true.

php5.3(2009-2012)
php5.3 算是一個非常大的更新,新增了大量新特征,同時也做了一些不向下兼容的修改。
php5.3棄用的功能】:以下幾個功能被棄用,若在配置文件中啟用,則 php 會在運行時發(fā)出警告。

Register Globals
這是 php.ini 中的一個選項(register_globals), 開啟后會將所有表單變量($_GET和$_POST)注冊為全局變量.
看下面的例子:
復制代碼 代碼如下:if(isAuth())
    $authorized = true;
if($authorized)
    include("page.php");
這段代碼在通過驗證時,將 $authorized 設(shè)置為 true. 然后根據(jù) $authorized 的值來決定是否顯示頁面.
但由于并沒有事先把 $authorized 初始化為 false, 當 register_globals 打開時,可能訪問 /auth.php?authorized=1 來定義該變量值,繞過身份驗證。
該特征屬于歷史遺留問題,在 php4.2 中被默認關(guān)閉,在 php5.4 中被移除。

Magic Quotes

對應(yīng) php.ini 中的選項 magic_quotes_gpc, 這個特征同樣屬于歷史遺留問題,已經(jīng)在 php5.4 中移除。
該特征會將所有用戶輸入進行轉(zhuǎn)義,這看上去不錯,在第一章我們提到過要對用戶輸入進行轉(zhuǎn)義。
但是 php 并不知道哪些輸入會進入 SQL , 哪些輸入會進入 Shell, 哪些輸入會被顯示為 HTML, 所以很多時候這種轉(zhuǎn)義會引起混亂。

Safe Mode
很多虛擬主機提供商使用 Safe Mode 來隔離多個用戶,但 Safe Mode 存在諸多問題,例如某些擴展并不按照 Safe Mode 來進行權(quán)限控制。
php官方推薦使用操作系統(tǒng)的機制來進行權(quán)限隔離,讓Web服務(wù)器以不同的用戶權(quán)限來運行php解釋器,請參見第一章中的最小權(quán)限原則.

php5.3的新增、改進】

匿名函數(shù)
也叫閉包(Closures), 經(jīng)常被用來臨時性地創(chuàng)建一個無名函數(shù),用于回調(diào)函數(shù)等用途。
復制代碼 代碼如下:$func = function($arg)
{
    print $arg;
};

$func("Hello World");
以上代碼定義了一個匿名函數(shù),并賦值給了 $func.
可以看到定義匿名函數(shù)依舊使用 function 關(guān)鍵字,只不過省略了函數(shù)名,直接是參數(shù)列表。
然后我們又調(diào)用了 $func 所儲存的匿名函數(shù)。
匿名函數(shù)還可以用 use 關(guān)鍵字來捕捉外部變量:
復制代碼 代碼如下:function arrayPlus($array, $num)
{
    array_walk($array, function(&$v) use($num){
        $v += $num;
    });
}
上面的代碼定義了一個 arrayPlus() 函數(shù)(這不是匿名函數(shù)), 它會將一個數(shù)組($array)中的每一項,加上一個指定的數(shù)字($num).
在 arrayPlus() 的實現(xiàn)中,我們使用了 array_walk() 函數(shù),它會為一個數(shù)組的每一項執(zhí)行一個回調(diào)函數(shù),即我們定義的匿名函數(shù)。
在匿名函數(shù)的參數(shù)列表后,我們用 use 關(guān)鍵字將匿名函數(shù)外的 $num 捕捉到了函數(shù)內(nèi),以便知道到底應(yīng)該加上多少。

魔術(shù)方法:__invoke(), __callStatic()
php 的面向?qū)ο篌w系中,提供了若干“魔術(shù)方法”,用于實現(xiàn)類似其他語言中的“重載”,如在訪問不存在的屬性、方法時觸發(fā)某個魔術(shù)方法。
隨著匿名函數(shù)的加入,php 引入了一個新的魔術(shù)方法 __invoke().
該魔術(shù)方法會在將一個對象作為函數(shù)調(diào)用時被調(diào)用:
復制代碼 代碼如下:class A
{
    public function __invoke($str)
    {
        print "A::__invoke(): {$str}";
    }
}

$a = new A;
$a("Hello World");
輸出毫無疑問是:
復制代碼 代碼如下:A::__invoke(): Hello World
__callStatic() 則會在調(diào)用一個不存在的靜態(tài)方法時被調(diào)用。


命名空間
php的命名空間有著前無古人后無來者的無比蛋疼的語法:
復制代碼 代碼如下:<?php
// 命名空間的分隔符是反斜杠,該聲明語句必須在文件第一行。
// 命名空間中可以包含任意代碼,但只有 **類, 函數(shù), 常量** 受命名空間影響。
namespace XXOO/Test;

// 該類的完整限定名是 /XXOO/Test/A , 其中第一個反斜杠表示全局命名空間。
class A{}

// 你還可以在已經(jīng)文件中定義第二個命名空間,接下來的代碼將都位于 /Other/Test2 .
namespace Other/Test2;

// 實例化來自其他命名空間的對象:
$a = new /XXOO/Test/A;
class B{}

// 你還可以用花括號定義第三個命名空間
namespace Other {
    // 實例化來自子命名空間的對象:
    $b = new Test2/B;

    // 導入來自其他命名空間的名稱,并重命名,
    // 注意只能導入類,不能用于函數(shù)和常量。
    use /XXOO/Test/A as ClassA
}
更多有關(guān)命名空間的語法介紹請參見官網(wǎng) [注].
命名空間時常和 autoload 一同使用,用于自動加載類實現(xiàn)文件:


spl_autoload_register(
    function ($class) {
        spl_autoload(str_replace("http://", "/", $class));
    }
);
當你實例化一個類 /XXOO/Test/A 的時候,這個類的完整限定名會被傳遞給 autoload 函數(shù),autoload 函數(shù)將類名中的命名空間分隔符(反斜杠)替換為斜杠,并包含對應(yīng)文件。
這樣可以實現(xiàn)類定義文件分級儲存,按需自動加載。
注:http://www.php.NET/manual/zh/language.namespaces.php

后期靜態(tài)綁定
php 的 OPP 機制,具有繼承和類似虛函數(shù)的功能,例如如下的代碼:
復制代碼 代碼如下:class A
{
    public function callFuncXXOO()
    {
        print $this->funcXXOO();
    }

    public function funcXXOO()
    {
        return "A::funcXXOO()";
    }
}

class B extends A
{
    public function funcXXOO()
    {
        return "B::funcXXOO";
    }
}

$b = new B;
$b->callFuncXXOO();
輸出是:
復制代碼 代碼如下:B::funcXXOO
可以看到,當在 A 中使用 $this->funcXXOO() 時,體現(xiàn)了“虛函數(shù)”的機制,實際調(diào)用的是 B::funcXXOO().
然而如果將所有函數(shù)都改為靜態(tài)函數(shù):
復制代碼 代碼如下:class A
{
    static public function callFuncXXOO()
    {
        print self::funcXXOO();
    }

    static public function funcXXOO()
    {
        return "A::funcXXOO()";
    }
}

class B extends A
{
    static public function funcXXOO()
    {
        return "B::funcXXOO";
    }
}

$b = new B;
$b->callFuncXXOO();
情況就沒這么樂觀了,輸出是:
復制代碼 代碼如下:A::funcXXOO()
這是因為 self 的語義本來就是“當前類”,所以 php5.3 給 static 關(guān)鍵字賦予了一個新功能:后期靜態(tài)綁定:
復制代碼 代碼如下:class A
{
    static public function callFuncXXOO()
    {
        print static::funcXXOO();
    }

    // ...
}

// ...
這樣就會像預期一樣輸出了:
復制代碼 代碼如下:B::funcXXOO

Heredoc 和 Nowdoc

php5.3 對 Heredoc 以及 Nowdoc 進行了一些改進,它們都用于在 php 代碼中嵌入大段字符串。
Heredoc 的行為類似于一個雙引號字符串:
復制代碼 代碼如下:$name = "MyName";
echo <<< TEXT
My name is "{$name}".
TEXT;
Heredoc 以三個左尖括號開始,后面跟一個標識符(TEXT), 直到一個同樣的頂格的標識符(不能縮進)結(jié)束。
就像雙引號字符串一樣,其中可以嵌入變量。

Heredoc 還可以用于函數(shù)參數(shù),以及類成員初始化:
復制代碼 代碼如下:var_dump(<<<EOD
Hello World
EOD
);

class A
{
    const xx = <<< EOD
Hello World
EOD;

    public $oo = <<< EOD
Hello World
EOD;
}
Nowdoc 的行為像一個單引號字符串,不能在其中嵌入變量,和 Heredoc 唯一的區(qū)別就是,三個左尖括號后的標識符要以單引號括起來:
復制代碼 代碼如下:$name = "MyName";
echo <<< 'TEXT'
My name is "{$name}".
TEXT;
輸出:
復制代碼 代碼如下:My name is "{$name}".

用 const 定義常量

php5.3 起同時支持在全局命名空間和類中使用 const 定義常量。
舊式風格:
復制代碼 代碼如下:define("XOOO", "Value");
新式風格:
const XXOO = "Value";
const 形式僅適用于常量,不適用于運行時才能求值的表達式:
復制代碼 代碼如下:// 正確
const XXOO = 1234;
// 錯誤
const XXOO = 2 * 617;

三元運算符簡寫形式
舊式風格:
復制代碼 代碼如下:echo $a ? $a : "No Value";
可簡寫成:
復制代碼 代碼如下:echo $a ?: "No Value";
即如果省略三元運算符的第二個部分,會默認用第一個部分代替。

Phar

Phar即php Archive, 起初只是Pear中的一個庫而已,后來在php5.3被重新編寫成C擴展并內(nèi)置到 php 中。
Phar用來將多個 .php 腳本打包(也可以打包其他文件)成一個 .phar 的壓縮文件(通常是ZIP格式)。
目的在于模仿 Java 的 .jar, 不對,目的是為了讓發(fā)布php應(yīng)用程序更加方便。同時還提供了數(shù)字簽名驗證等功能。
.phar 文件可以像 .php 文件一樣,被php引擎解釋執(zhí)行,同時你還可以寫出這樣的代碼來包含(require) .phar 中的代碼:
復制代碼 代碼如下:require("xxoo.phar");
require("phar://xxoo.phar/xo/ox.php");
更多信息請參見官網(wǎng) [注].
注:http://www.php.NET/manual/zh/phar.using.intro.php

php5.4(2012-2013)

Short Open Tag
Short Open Tag 自 php5.4 起總是可用。
在這里集中講一下有關(guān) php 起止標簽的問題。即:
復制代碼 代碼如下:<?php
// Code...
?>
通常就是上面的形式,除此之外還有一種簡寫形式:
復制代碼 代碼如下:<? /* Code... */ ?>
還可以把
復制代碼 代碼如下:<?php echo $xxoo;?>
簡寫成:
復制代碼 代碼如下:<?= $xxoo;?>
這種簡寫形式被稱為 Short Open Tag, 在 php5.3 起被默認開啟,在 php5.4 起總是可用。
使用這種簡寫形式在 HTML 中嵌入 php 變量將會非常方便。

對于純 php 文件(如類實現(xiàn)文件), php 官方建議頂格寫起始標記,同時 省略 結(jié)束標記。
這樣可以確保整個 php 文件都是 php 代碼,沒有任何輸出,否則當你包含該文件后,設(shè)置 Header 和 Cookie 時會遇到一些麻煩 [注].

注:Header 和 Cookie 必須在輸出任何內(nèi)容之前被發(fā)送。

數(shù)組簡寫形式
這是非常方便的一項特征!
復制代碼 代碼如下:// 原來的數(shù)組寫法
$arr = array("key" => "value", "key2" => "value2");
// 簡寫形式
$arr = ["key" => "value", "key2" => "value2"];

Traits
所謂Traits就是“構(gòu)件”,是用來替代繼承的一種機制。php中無法進行多重繼承,但一個類可以包含多個Traits.
復制代碼 代碼如下:// Traits不能被單獨實例化,只能被類所包含
trait SayWorld
{
    public function sayHello()
    {
        echo 'World!';
    }
}

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

$xxoo = new MyHelloWorld();
// sayHello() 函數(shù)是來自 SayWorld 構(gòu)件的
$xxoo->sayHello();
Traits還有很多神奇的功能,比如包含多個Traits, 解決沖突,修改訪問權(quán)限,為函數(shù)設(shè)置別名等等。
Traits中也同樣可以包含Traits. 篇幅有限不能逐個舉例,詳情參見官網(wǎng) [注].
注:http://www.php.NET/manual/zh/language.oop5.traits.php

內(nèi)置 Web 服務(wù)器
php從5.4開始內(nèi)置一個輕量級的Web服務(wù)器,不支持并發(fā),定位是用于開發(fā)和調(diào)試環(huán)境。
在開發(fā)環(huán)境使用它的確非常方便。
復制代碼 代碼如下:php -S localhost:8000
這樣就在當前目錄建立起了一個Web服務(wù)器,你可以通過 http://localhost:8000/ 來訪問。
其中l(wèi)ocalhost是監(jiān)聽的ip,8000是監(jiān)聽的端口,可以自行修改。

很多應(yīng)用中,都會進行URL重寫,所以php提供了一個設(shè)置路由腳本的功能:
復制代碼 代碼如下:php -S localhost:8000 index.php
這樣一來,所有的請求都會由index.php來處理。
你還可以使用 XDebug 來進行斷點調(diào)試。

細節(jié)修改
php5.4 新增了動態(tài)訪問靜態(tài)方法的方式:
復制代碼 代碼如下:$func = "funcXXOO";
A::{$func}();
新增在實例化時訪問類成員的特征:
復制代碼 代碼如下:(new MyClass)->xxoo();
新增支持對函數(shù)返回數(shù)組的成員訪問解析(這種寫法在之前版本是會報錯的):
復制代碼 代碼如下:print func()[0];

php5.5(2013起)

yield
yield關(guān)鍵字用于當函數(shù)需要返回一個迭代器的時候, 逐個返回值。
復制代碼 代碼如下:function number10()
{
    for($i = 1; $i <= 10; $i += 1)
        yield $i;
}
該函數(shù)的返回值是一個數(shù)組:
復制代碼 代碼如下:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
list() 用于 foreach
可以用 list() 在 foreach 中解析嵌套的數(shù)組:
復制代碼 代碼如下:$array = [
    [1, 2, 3],
    [4, 5, 6],
];

foreach ($array as list($a, $b, $c))
    echo "{$a} {$b} {$c}/n";
結(jié)果:
復制代碼 代碼如下:1 2 3
4 5 6
細節(jié)修改
不推薦使用 mysql 函數(shù),推薦使用 PDO 或 MySQLi, 參見前文。
不再支持Windows XP.
可用 MyClass::class 取到一個類的完整限定名(包括命名空間)。
empty() 支持表達式作為參數(shù)。
try-catch 結(jié)構(gòu)新增 finally 塊。

php5.6

更好的常量
定義常量時允許使用之前定義的常量進行計算:
復制代碼 代碼如下:const A = 2;
const B = A + 1;

class C
{
    const STR = "hello";
    const STR2 = self::STR + ", world";
}
允許常量作為函數(shù)參數(shù)默認值:
復制代碼 代碼如下:function func($arg = C::STR2)

更好的可變函數(shù)參數(shù)
用于代替 func_get_args()
復制代碼 代碼如下:function add(...$args)
{
    $result = 0;
    foreach($args as $arg)
        $result += $arg;
    return $result;
}
同時可以在調(diào)用函數(shù)時,把數(shù)組展開為函數(shù)參數(shù):
復制代碼 代碼如下:$arr = [2, 3];
add(1, ...$arr);
// 結(jié)果為 6
命名空間
命名空間支持常量和函數(shù):
復制代碼 代碼如下: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();
}

php技術(shù)PHP5各個版本的新功能和新特性總結(jié),轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 亚洲高清视频网站 | 国产成人精品一区二区秒拍 | 欧美成人免费全部观看天天性色 | 91网站视频在线观看 | 一区一区三区产品乱码 | 午夜丁香婷婷 | 色哟哟在线观看精品大全视频 | 综合久久综合 | 中文字幕美日韩在线高清 | 国产女人视频 | 国产短视频精品区第一页 | 一区二区视频在线观看高清视频在线 | 最新国产福利在线观看 | 亚洲成a人一区二区三区 | 性感美女一级毛片 | 国产成人综合精品一区 | 久久毛片久久毛 | 激情六月天婷婷 | 欧美一级免费 | 黄色免费网站在线 | 亚洲国产97在线精品一区 | 日本一区二区三区免费观看 | 中文字幕一区二区视频 | 色视频在线免费 | 福利一区二区 | 精品阁| 91视频免费观看 | 国产正在播放 | 激情综合在线 | selaoban在线视频免费精品 | 欧美人人做人人爽人人喊 | 国产91小视频 | 91无套极品外围在线播放 | 丁香六月婷婷七月激情 | 亚1洲二区三区四区免费 | 久久99精品久久久久久久不卡 | 性开放视频| 激情综合丝袜美女一区二区 | 久久精品免视看国产盗摄 | 99xxoo视频在线永久免费观看 | 国产综合成人观看在线 |