1欲逃、PHP8如約而至
訪問(wèn) PHP官方鳞芙,我們已經(jīng)可以看到php8穩(wěn)定版已經(jīng)可以下載使用了牺荠,這對(duì)PHP來(lái)說(shuō)是一個(gè)重大版本骚灸。有別于PHP7糟趾,萬(wàn)眾矚目的Just In Time Compilation(即時(shí)編譯)功能成為了大家期待的重點(diǎn)。
php8下載地址:
php8新特性介紹:
2甚牲、PHP8新特性
- 命名參數(shù)
php8支持命名參數(shù)义郑,這樣靠前的有默認(rèn)的參數(shù),就不用必須明確寫(xiě)出丈钙,如下php8跳過(guò)第二和第三個(gè)默認(rèn)參數(shù)非驮,直接指定第四個(gè)參數(shù)。開(kāi)發(fā)者可以按自己的意愿更改參數(shù)順序雏赦,這樣的好處是劫笙,擺脫了php函數(shù)有些不經(jīng)常用的參數(shù)靠前,代碼中又必須明確寫(xiě)出才能給后面的參數(shù)賦值的困擾星岗。
簡(jiǎn)單例子如下:詳情參考
//php7
htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
//php8
htmlspecialchars($string, double_encode: false);
- 注解語(yǔ)法
通過(guò)重復(fù)使用現(xiàn)有標(biāo)記T_SL和T_SR填大,注解是用“ <<”和“ >>”括起來(lái)的特殊格式的文本。詳情參考
注解可以用該語(yǔ)言應(yīng)用于許多事物:
函數(shù)(包括閉包和短閉包)
類(lèi)(包括匿名類(lèi))俏橘,接口允华,特征
類(lèi)常量
類(lèi)屬性
類(lèi)方法
功能/方法參數(shù)
namespace My\Attributes {
<<PhpAttribute>>
class SingleArgument {
public $argumentValue;
public function __construct($argumentValue) {
$this->argumentValue = $argumentValue;
}
}
}
namespace {
<<SingleArgument("Hello World")>>
class Foo {
}
$reflectionClass = new \ReflectionClass(Foo::class);
$attributes = $reflectionClass->getAttributes();
var_dump($attributes[0]->getName());
var_dump($attributes[0]->getArguments());
var_dump($attributes[0]->newInstance());
}
/**
string(28) "My\Attributes\SingleArgument"
array(1) {
[0]=>
string(11) "Hello World"
}
object(My\Attributes\SingleArgument)#1 (1) {
["argumentValue"]=>
string(11) "Hello World"
}
**/
- 構(gòu)造函數(shù)參數(shù)改進(jìn),詳情參考
//php7
class Point {
public float $x;
public float $y;
public float $z;
public function __construct(
float $x = 0.0,
float $y = 0.0,
float $z = 0.0,
) {
$this->x = $x;
$this->y = $y;
$this->z = $z;
}
}
//php8
class Point {
public function __construct(
public float $x = 0.0,
public float $y = 0.0,
public float $z = 0.0,
) {}
}
- 聯(lián)合類(lèi)型
當(dāng)給函數(shù)傳參敷矫,參數(shù)可能有多重類(lèi)型例获,傳統(tǒng)PHP7下并不支持校驗(yàn),PHP8可以完美實(shí)現(xiàn)校驗(yàn)曹仗。詳情參考
//php7
class Number {
/** @var int|float */
private $number;
/**
* @param float|int $number
*/
public function __construct($number) {
$this->number = $number;
}
}
new Number('NaN'); // Ok
//php8
class Number {
public function __construct(
private int|float $number
) {}
}
new Number('NaN'); // TypeError
- 匹配表達(dá)榨汤,詳情參考
php8擁有更精簡(jiǎn)的新語(yǔ)法,這個(gè)贊成的成員非常多怎茫,反對(duì)的很少收壕,可見(jiàn)大家對(duì)switch語(yǔ)法意見(jiàn)頗大。
//php7
switch (8.0) {
case '8.0':
$result = "Oh no!";
break;
case 8.0:
$result = "This is what I expected";
break;
}
echo $result;
//php8
echo match (8.0) {
'8.0' => "Oh no!",
8.0 => "This is what I expected",
};
- 空安全運(yùn)算符轨蛤,詳情參考
//php7
$country = null;
if ($session !== null) {
$user = $session->user;
if ($user !== null) {
$address = $user->getAddress();
if ($address !== null) {
$country = $address->country;
}
}
}
//php8
$country = $session?->user?->getAddress()?->country;
- 字符串和數(shù)字比較蜜宪,詳情參考
在php8中,數(shù)字和字符串比較時(shí)祥山,會(huì)將數(shù)字轉(zhuǎn)成字符串圃验,正好和之前相反。
//php7
0 == 'foobar' // true
//php8
0 == 'foobar' // false
- 函數(shù)內(nèi)部一致性校驗(yàn)錯(cuò)誤缝呕,詳情參考
php8如果參數(shù)驗(yàn)證失敗澳窑,大多數(shù)內(nèi)部函數(shù)將引發(fā)Error異常斧散。
這個(gè)改進(jìn)對(duì)開(kāi)發(fā)者提出了更高的要求,原來(lái)的warning錯(cuò)誤摊聋,會(huì)直接升級(jí)為error錯(cuò)誤鸡捐。
//php7
strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0
//php8
strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0
-
中重要的即時(shí)編譯功能
PHP 8引入了兩個(gè)JIT編譯引擎。 跟蹤JIT是兩者中最有希望的麻裁,它在綜合基準(zhǔn)測(cè)試中的性能提高了大約3倍箍镜,在某些特定的長(zhǎng)期運(yùn)行的應(yīng)用程序中提高了1.5–2倍。 典型的應(yīng)用程序性能與PHP 7.4相當(dāng)煎源。