PHP5.三、5.四、5.五、5.6各版本重要更新簡述

今天無事,偶爾看到phpstorm中的版本選擇處有關於各版本的區別的簡短描述,因而總結一下。php

clipboard.png
PHP5.3相對於以前版本,最大區別也就是命名空間和匿名函數了,這在平時開發和各大框架中都用的比較多了,就再也不詳述了。
PHP5.4的主要更新是數組簡寫語法格式和traits了。
關於數組簡寫,提及來也挺簡單,只是爲數組添加了一個新的聲明方法,以下:html

// PHP5.4以前
$array = array(
    "foo" => "bar",
    "bar" => "foo",
);

// 自 PHP 5.4 起
$array = [
    "foo" => "bar",
    "bar" => "foo",
];

而關於PHP5.4的traits就比較少見了,代碼說明:laravel

class Base {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait SayWorld {
    public function sayHello() {
        parent::sayHello();
        echo 'World!';
    }
}

class MyHelloWorld extends Base {
    use SayWorld;
}

$o = new MyHelloWorld();
$o->sayHello();

說明一下:結果是'Hello World!',從基類繼承的方法會被trait中的同名方法覆蓋,當前類中的方法覆蓋trait中的同名成員;若是trait中定義了屬性,則當前類中不能定義同名屬性;trait中也能夠定義抽象方法和靜態成員。能夠使用多個trait,它們之間用逗號分隔,以下:數組

use SayHello1,SayHello2;

若是SayHello1和SayHello2中有同名成員,會產生致命錯誤,解決方法以下:框架

use SayHello1,SayHello2 {
    SayHello1::sayHello insteadof SayHello2;  // 意思是用SayHello1中的sayHello方法代替SayHello2中的同名方法,注:此處的sayHello不必定是靜態方法
    // ...
    // 或
    SayHello1::sayHello as sayHello1;  // 爲其另取一個名字,也可解決
}

PHP5.5中的變化主要是異常處理中添加finally關鍵字和生成器generator。
關於finally,代碼說明:phpstorm

try {
    throw new ErrorException('Some Error Message');
} catch (ErrorException $e) {
    echo $e->getMessage()."111 \n";
} catch(Exception $e) {
    echo $e->getMessage()."222 \n";
} finally {
    echo 'finally';
}

無論產沒產生異常,都會輸出finally。函數

關於生成器generator,我看了看手冊,不明覺厲。明白了再加上...
今天先到這兒......post


關於generator,今天看到一篇文章(http://laravelacademy.org/post/4317.html),有些小體會,寫下來作個記錄,定義啥的就不說了,簡單說就是爲了節約內存
首先,建立生成器,相似函數,但不返回值,只生成值,有點兒彆扭spa

function getGenerator() {
    yield 'I';
    yield 'am';
    yield 'Polly';
}

使用生成器,生成器的返回值是一個Generator對象code

foreach (getGenerator() as $val) {
    echo $val . PHP_EOL;
}

看到這裏,有人會認爲,這和tm函數有毛區別,函數返回一個數組不照樣循環出來麼,看下面的例子:

function makeRange1($length) {
    $dataSet = [];
    for ($i=0; $i<$length; $i++) {
        $dataSet[] = $i;
    }
    return $dataSet;
}
function makeRange2($length) {
    for ($i=0; $i<$length; $i++) {
        yield $i;
    }
}
// 分別執行makeRange1(1000000)和makeRange2(1000000),便會看出來,第一個直接報錯,由於內存佔用過多,第二個則不會

用處,若是要讀取一個超大的文本文件,確定是用生成器來的更快更節約內存一些

function getRows($file) {
    $handle = fopen($file, 'rb');
    if ($handle == FALSE) {
        throw new Exception();
    }
    while (feof($handle) === FALSE) {
        yield fgetcsv($handle);
    }
    fclose($handle);
}

foreach ($getRows($file) as $row) {
    print_r($row);
}

ok

相關文章
相關標籤/搜索