php7和PHP5對比的新特性和性能優化
1. 抽象語法樹(AST)
AST在PHP編譯過程作爲一箇中間件的角色,替換原來直接從解釋器吐出opcode的方式,讓解釋器(parser)和編譯器(compliler)解耦,可以減少一些Hack代碼,同時,讓實現更容易理解和可維護
2. Natice TLS:
線程數據共享安全,開啓一個全局線程用作數據共享內存空間
3. 指定參數 返回值類型
4. zval 結構的變化
5. 異常處理
PHP 5 的 try ... catch ... finally 無法處理傳統錯誤,如果需要,你通常會考慮用 set_error_handler() 來 Hack 一下。但是仍有很多錯誤類型是 set_error_handler() 捕捉不到的
PHP 7引入 Throwable 接口,錯誤及異常都實現了 Throwable,無法直接實現 Throwable,但可以擴展 \Exception 和 \Error 類。可以用 Throwable 捕捉異常跟錯誤。\Exception 是所有PHP及用戶異常的基類;\Error 是所有內部PHP錯誤的基類。
6. 新的參數解析方式
7. hashtable變化
buckets、Zvals不再單獨分配內存,消除了很多沒用的冗餘。
8、空合併操作符(Null Coalesce Operator)
直接上例子:
$name = $name ?? "NoName"; // 如果$name有值就取其值,否則設$name成"NoName"
9、飛船操作符(Spaceship Operator)(組合比較操作符)
形式:(expr) <=> (expr)
左邊運算對象小,則返回-1;左、右兩邊運算對象相等,則返回0;左邊運算對象大,則返回1。
$name = ["Simen", "Suzy", "Cook", "Stella"];
usort($name, function ($left, $right) {
return $left <=> $right;
});
print_r($name);
PHP 7 之前只允許類/接口中使用常量數組,現在 PHP 7 也支持非類/接口的普通常量數組了。
define("USER", [
"name" => "Simen",
"sex" => "Male",
"age" => "38",
"skill" => ["PHP", "MySQL", "C"]
]);
// USER["skill"][2] = "C/C++"; // PHP Fatal error: Cannot use temporary expression in write context in...
$goo = [
"bar" => [
"baz" => 100,
"cug" => 900
]
];
$foo = "goo";
$$foo["bar"]["baz"]; // 實際爲:($$foo)['bar']['baz']; PHP 5 中爲:${$foo['bar']['baz']};
// PHP 7 中一個籠統的判定規則是,由左向右結合。
這是 PHP 7 引進的一個值得期待的新特性,將極大增強 PHP 錯誤處理能力。PHP 5 的 try ... catch ... finally 無法處理傳統錯誤,如果需要,你通常會考慮用 set_error_handler() 來 Hack 一下。但是仍有很多錯誤類型是 set_error_handler() 捕捉不到的。PHP 7引入 Throwable 接口,錯誤及異常都實現了 Throwable,無法直接實現 Throwable,但可以擴展 \Exception 和 \Error 類。可以用 Throwable 捕捉異常跟錯誤。\Exception 是所有PHP及用戶異常的基類;\Error 是所有內部PHP錯誤的基類。
$name = "Tony";
try {
$name = $name->method();
} catch (\Error $e) {
echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;
}
try {
$name = $name->method();
} catch (\Throwable $e) {
echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;
}
try {
intdiv(5, 0);
} catch (\DivisionByZeroError $e) {
echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;
}
use 組合聲明可以減少 use 的輸入冗餘。
use PHPGoodTaste\Utils\{
Util,
Form,
Form\Validation,
Form\Binding
};
PHP 7.1 新添加了捕獲多種異常/錯誤類型的語法——通過豎槓“|”來實現。
try {
throw new LengthException("LengthException");
// throw new DivisionByZeroError("DivisionByZeroError");
// throw new Exception("Exception");
} catch (\DivisionByZeroError | \LengthException $e) {
echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;
} catch (\Exception $e) {
echo "出錯消息 --- ", $e->getMessage(), PHP_EOL;
} finally {
// ...
}
PHP 7.1 之前的類常量是不允許添加可見性修飾符的,此時類常量可見性相當於 public。PHP 7.1 爲類常量添加了可見性修飾符支持特性。總的來說,可見性修飾符使用範圍如下所示:
- 函數/方法:public、private、protected、abstract、final
- 類:abstract、final
- 屬性/變量:public、private、protected
- 類常量:public、private、protected
class YourClass
{
const THE_OLD_STYLE_CONST = "One";
public const THE_PUBLIC_CONST = "Two";
private const THE_PRIVATE_CONST = "Three";
protected const THE_PROTECTED_CONST = "Four";
}
iterable 僞類型
PHP 7.1 引入了 iterable 僞類型。iterable 類型適用於數組、生成器以及實現了 Traversable 的對象,它是 PHP 中保留類名。
$fn = function (iterable $it) : iterable {
$result = [];
foreach ($it as $value) {
$result[] = $value + 1000;
}
return $result;
};
$fn([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
可空類型(Nullable Type)
PHP 7.1 引入了可空類型。看看新興的 Kotlin 編程語言的一個噱頭特性就是可空類型。PHP 越來越像“強類型語言了”。對於同一類型的強制要求,可以設置其是否可空。
$fn = function (?int $in) {
return $in ?? "NULL";
};
$fn(null);
$fn(5);
$fn(); // TypeError: Too few arguments to function {closure}(), 0 passed in ...
Void 返回類型
PHP 7.1 引入了 Void 返回類型。
function first(): void {
// ...
}
function second(): void {
// ...
return;
}
轉自:
https://blog.csdn.net/fish_study_csdn/article/details/80407755