PHP7.4新特性預覽
- 短閉包RFC
- 屬性類型定義RFC
- Null Coalescing Assignment Operator RFC
- 自定義對象序列化RFC
- 棄用左關聯三元運算符RFC
- 預加載RFC
- 外部函數接口RFC
- Reflection for references RFC
- mb_str_split RFC
- ext-hash始終開啟RFC
短閉包
引用更簡單的閉包寫法,增加了類似Lambda
的表達式的寫法。
<?php
// 7.3之前
array_map(function (User $user) {
return $user->id;
}, $users)
// 现在
array_map(fn(User $user) => $user->id, $users)
在原來的基礎加上fn
關鍵字。採用了類型javascript
=>
寫法。
屬性類型定義
可以指定類屬性的類型定義,更加的明確類型。
<?php
class A
{
public string $name;
public Foo $foo;
protected ClassName $classType;
private ?ClassName $nullableClassType;
// Types are also legal on static properties
public static iterable $staticProp;
}
這項特性增加,在寫大型工程的時候,不必為變量類型返回值來回查看源碼,這樣對IDE的支持也更好。
Null Coalescing Assignment Operator
更短的??
操作符寫法。
<?php
// 7.4之前
$data['date'] = $data['date'] ?? new DateTime();
// 现在
$data['date'] ??= new DateTime();
棄用左關聯三元運算符
與大多數其他語言不同,PHP中的三元運算符是左關聯的而不是右關聯的。對於在不同語言之間切換的程序員來說,左關聯行為通常沒有用,並且令人困惑。此RFC建議棄用並刪除三元運算符的左關聯性,並且需要顯式使用括號。
<?php
echo 1 ? 2 : 3 ? 4 : 5; // deprecated 7.4, 7.3 之前这是ok的。
echo (1 ? 2 : 3) ? 4 : 5; // ok
自定義對象序列化
添加兩個新的序列化魔術方法__serialize
, __unserialize
主要來解決__wakeup
和Serializable
帶來一些問題。可以通過https://wiki.php.net/rfc/custom_object_serialization來查看對比。
預加載
預加載是PHP這期核心的變更,可以帶來一些重大的性能改進。
簡而言之,如果您使用的所有PHP Web框架,則必須在每次請求時加載和重新編譯其文件。預加載允許服務器在啟動時在內存中加載PHP文件,並使它們永久可用於所有後續請求。
性能提升當然需要付出代價,如果預加載文件的來源發生變化,則必須重新啟動服務器。
外部函數接口
外部函數接口,簡稱FFI
,此API允許在純PHP中加載共享庫(.DLL或.so),調用C函數和訪問C數據結構,而無需深入了解Zend擴展API,也無需學習第三種“中間”語言。對於PHP,FFI開闢了一種在純PHP中編寫PHP擴展和綁定到C庫的方法。。這是一個複雜的主題。您仍然需要C知識才能正確使用此功能。大家可以閱讀該項目來了解https://github.com/dstogov/php-ffi。
Reflection for references
像Symfony
的varCloner轉儲程序,這樣的庫很大程度上依賴於反射API來可靠地轉儲變量。以前,沒有對引用的適當反射支持,導致這些庫依賴hack來檢測引用。PHP 7.4添加了ReflectionReference類來解決這個問題。
mb_str_split
添加了多字節的字符串分割函數和str_split
一樣。
<?php
print_r(mb_str_split("你好中国", 2));
Array
(
[0] => 你好
[1] => 中国
)
ext-hash 默認開啟
哈希擴展(ext / hash
)始終可用,類似於date
,spl
和pcre
擴展。
以上就是PHP 7.4
新特性和函數,如果你需要查看所有的更新,你可以通過官方公開的日誌查看。這個版本對性能提升是非常明顯的特別預加載的功能。讓我們拭目以待吧。官方預計發布日期可能在2019年12月左右。