PHP 7.4 新特性

PHP 7.4 計劃在2019年11月21日發佈,它主要新增瞭如下幾個特性:php

  • 短閉包函數(short closure)
  • 預加載提交性能
  • 屬性類型限定
  • Improved type variance(不會翻譯)
  • 三元運算簡寫
  • 數組展開運算
  • 新增類的魔術方法:serialization
  • 數字分隔符
  • 運算優先順序
  • 容許在__toString中拋出異常
  • 支持反射引用
  • 新增字節分割函數
  • 移除php短標籤
  • 棄用左關聯運算符
  • 再也不向後兼容的變動

短閉包函數

短閉包函數能夠減小冗餘代碼:數組

array_map(function (User $user) { 
    return $user->id; 
}, $users)
array_map(fn(User $user) => $user->id, $users)

須要注意幾點:閉包

  1. 短閉包能夠直接訪問閉包函數外面的變量,因此不須要再寫 use 關鍵詞
  2. fn關鍵詞開始
  3. $this 能夠像普通的閉包同樣使用
  4. 短閉包只有一行代碼,僅僅作返回聲明使用,不容許使用return 關鍵詞

還可使用更嚴格類型的方式框架

$ids = array_map(fn(User $user): int => $user->id, $user);

預加載

PHP預加載能夠極大的提升性能dom

優勢:在PHP 7.4之前,若是你使用了框架來開發,每次請求文件就必須加載和從新編譯。預加載在框架啓動時在內存中加載文件,並且在後續請求中永久有效。函數

缺點:性能的提高會在其餘方面花費很大的代價,每次預加載的文件發生改變時,框架須要從新啓動。性能

屬性類型限定

class A
{
    public string $name;
    
    public Foo $foo;
}

不得不說,PHP愈來愈接近Java等強類型語言this

Improved type variance

協變返回類型:翻譯

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}

依賴(是否是很熟悉):code

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    { /* … */ }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    { /* … */ }
}

簡寫三元運算符

在目前> PHP 7之後的寫法:

$data['date'] = $data['date'] ?? new DateTime();

PHP 7.4你能夠這樣寫:

$data['date'] ??= new DateTime();

數組展開運算

合併數組到另外一個數組中,返回一維數組

$arrayA = [1, 2, 3];

$arrayB = [4, 5];

$result = [0, ...$arrayA, ...$arrayB, 6 ,7];

// [0, 1, 2, 3, 4, 5, 6, 7]

注意 :只對數字索引有效

新增類的魔術方法

RFC添加了兩個新的魔術方法__serialize__unserialize

數字分隔符

容許使用下劃線更直觀的分隔數值

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88;

運算優先順序

PHP 7.4以前,若是你這樣寫:

echo "sum: " . $a + $b;

PHP會解析爲:

echo ("sum: " . $a) + $b;

PHP 8將會解析爲:

echo "sum :" . ($a + $b);

__toString中拋出異常

支持反射引用

PHP 7.4將會新增ReflectionReference

移除php短標籤

<?將會在PHP 8中移除,<?=會繼續保留

棄用左關聯運算符

PHP遺留了一些奇怪的怪癖,好比

1 ? 2 : 3 ? 4 : 5;   // 將會在 PHP 7.4 中廢棄,在 PHP 8中會拋出編譯錯誤

(1 ? 2 : 3) ? 4 : 5; // 正確

再也不向後兼容的變動

  1. 棄用在沒有父類的狀況下調用parent::
  2. 調用var_dump打印DateTimeDateTimeImmutableshi'實例,將再也不保留對象上的可訪問屬性
  3. openssl_random_pseudo_bytes 會在調用錯誤時拋出異常
  4. 序列化PDOPDOStatement 實例將會生成一個Exception而不是PDOException異常
  5. 調用get_object_vars()打印ArrayObject 實例將會返回ArrayObject 本身的屬性,而不是被包裹的數組或對象的值,

數組強制轉換不受影響

相關文章
相關標籤/搜索