目錄
核心改进
参数类型声明
对象返回类型声明
参数类型泛化
列表语法中的尾随逗号
安全性改进
密码哈希中的Argon2
Libsodium 成为 PHP 核心的组成部分
弃用
PHP 7.2 對 WordPress 使用者意味著什麼?
升級到 PHP 7.2
結語
首頁 後端開發 php教程 PHP 7.2 新功能介紹

PHP 7.2 新功能介紹

May 24, 2018 pm 02:47 PM
php 介紹 新功能

本篇文章给大家分享的内容是关于PHP 7.2 新功能介绍,有着一定的参考价值,有需要的朋友可以参考一下

PHP 7.2 已經在 2017 年 11 月 30 日 正式發布 。這次發布包含新特性、功能,及優化,以讓我們寫出更好的代碼。在這篇文章裡,我將會介紹一些 PHP 7.2 最有趣的語言特性。

你可以在 Requests For Comments 頁面查看完整的更動清單。

核心改进

参数类型声明

从 PHP5 起,我们可以指定函数参数的预期声明类型。如果传参类型错误,PHP 就会抛出一个错误。

参数类型声明 (也称类型提示) 指定预期要传参给函数或者类方法的参数类型。

这里有个例子:

class MyClass {
    public $var = 'Hello World';
}$myclass = new MyClass;function test(MyClass $myclass){
    return $myclass->var;
}echo test($myclass);
登入後複製

在这段代码中,测试函数需要一个 MyClass 实例。不正确的参数数据类型会导致一个致命错误。

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of MyClass, string given, called in /app/index.php on line 12 and defined in /app/index.php:8
登入後複製

从 PHP 7.2 类型提示 可以被用在对象型数据上,并且这个改进允许通用对象类型作为一个函数或者方法的参数。这里有个例子:

class MyClass {
    public $var = '';
}class FirstChild extends MyClass {
    public $var = 'My name is Jim';
}class SecondChild extends MyClass {
    public $var = 'My name is John';
}$firstchild = new FirstChild;$secondchild = new SecondChild;function test(object $arg) {
    return $arg->var;
}echo test($firstchild);echo test($secondchild);
登入後複製

在以上示例中,我们调用了两次测试函数,每次都传递一个不同的对象。这在之前的 PHP 版本中是前所未有的。

PHP 7.2 新功能介紹

在 Docker 中测试 PHP 7.0 和 PHP 7.2 的类型提示。

对象返回类型声明

若变量类型指定函数参数的预期类型,返回值类型同样也可以被指定预期类型。

返回类型声明 指定一个函数应该返回的预期类型。

PHP 7.2 起,对象数据类型可以使用返回类型声明。这里有个例子:

class MyClass {
    public $var = 'Hello World';
}

$myclass = new MyClass;function test(MyClass $arg) : object {
    return $arg;
}

echo test($myclass)->var;
登入後複製

之前的 PHP 版本会抛出以下致命错误:

Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10
登入後複製

当然,PHP 7.2 的代码会打印出 ‘Hello World’。

参数类型泛化

PHP 目前是不允许子类和它父类或者接口的参数类型有任何差异的。 这是什么意思呢?
参考下以下代码:

<?phpclass MyClass {
    public function myFunction(array $myarray) { /* ... */ }
}class MyChildClass extends MyClass {
    public function myFunction($myarray) { /* ... */ }
}
登入後複製

这里我们省略了子类中的参数类型。 在 PHP 7.0 中,会产生以下警告:

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8
登入後複製

从 PHP 7.2 起,我们可以忽略子类中的类型 而不会破坏任何代码。这个方案使得我们可以在库中升级类,从而可以使用类型提示,却无需更新其所有的子类。

列表语法中的尾随逗号

在 PHP 数组的最后一个元素上使用尾随逗号是 合法语法 ,并且 有时候鼓励这么做 ,可以很轻松的避免增加新元素的时候出现缺失逗号的错误。 从 PHP 7.2 在 分组命名空间 中,我们可以使用尾随逗号 。

参阅 列表语法中的尾随逗号 获得 RFC 的直观感知和一些示例代码。

安全性改进

密码哈希中的Argon2

Argon2 是荣获 2015 年密码哈希算法比赛中的冠军的强大哈希算法, PHP 7.2 将其作为安全  Bcrypt 算法的替代品。
新版的 PHP 中引入了 PASSWORD_ARGON2I 常量,现在可以在 password_* 系列函数中使用:

password_hash(&#39;password&#39;, PASSWORD_ARGON2I);
登入後複製

与只使用一个 cost 因子的 Bcrypt 不同, Argon2 使用三个 cost 因子 区分如下:

  • 定义哈希计算期间应该消耗的KiB数量的内存开销(默认值为1 << 10或1024 KiB或1 MiB)

  • 定义哈希算法迭代次数的时间开销(默认值为2)

  • 并行因子,用于设置哈希计算时使用的并行线程数(缺省值为2)

以下三个新常量定义了默认的 cost 因子:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST

  • PASSWORD_ARGON2_DEFAULT_TIME_COST

  • PASSWORD_ARGON2_DEFAULT_THREADS

这里有个例子:

$options = [&#39;memory_cost&#39; => 1<<11, &#39;time_cost&#39; => 4, &#39;threads&#39; => 2];
password_hash(&#39;password&#39;, PASSWORD_ARGON2I, $options);
登入後複製

查阅 Argon2 密码哈希 的更多信息。

Libsodium 成为 PHP 核心的组成部分

从 7.2 版开始,PHP 在其核心中涵盖了 Sodium library 。 Libsodium 是一个跨平台和跨语言的库,用于加密,解密,签名,密码哈希等。
这个库之前是 通过 PECL 来提供的。
有关 Libsodium 函数列表,参阅 快速入门。
也可参阅 PHP 7.2: 第一个将现代加密技术添加到其标准库的编程语言。

弃用

这里有个 PHP 7.2 弃用函数和特性 清单,PHP 8.0 之后将全部移除。

PHP 5.1 中 __autoload 函数已被 spl_autoload_register 取代。现在会在编译期间报一个弃用通知。

当抛出致命错误的时候,会创建 $php_errormsg 局部变量。 PHP 7.2 中应该使用 error_get_last 和 error_clear_last 替代这种做法。

create_function() 可以建立一個具有函數名稱的函數,將函數參數和函數體作為該函數的清單傳入。因為安全問題和性能表現不佳,它被標記為棄用,鼓勵用封裝替代。

mbstring.func_overload ini 設定為非零值已經被標記為棄用。

(unset) cast 是個總是傳回 null 的表達式,而且毫無用處。

若傳入第二個參數,parse_str() 將查詢字串解析到陣列當中, 否則解析到本機符號表。因為安全原因, 不建議 在函數作用域中動態設定變量,使用不帶第二個參數的 parse_str() 將拋棄一個棄用通知。

gmp_random() 是平台相關的,將會被廢棄。使用 gmp_random_bits() 和 gmp_random_rage() 代替。

each() 在陣列上迭代的行為非常像 foreach(),但 foreach() 基於某些原因而成為更優選擇,例如它的速度快上 10 倍。現在在循環中使用前者將會拋出一個廢棄提示。

 assert() 函數檢查給定的斷言,並在結果為 FALSE 的時候進行相關處理。帶有字串參數的 assert() 現在已經棄用,因為它有 RCE 漏洞。 zend.assertion ini 選項可以關閉斷言表達式。

$errcontext 是包含產生錯誤時的局部變數陣列。它可被當作錯誤處理程序 set_error_handler() 函數的最後一個參數。

PHP 7.2 對 WordPress 使用者意味著什麼?

根據官方 WordPress 統計頁 所示,截至撰寫本文時,只有 19.8% 的 WordPress 用戶升級到了 PHP 7。只有 5%使用 PHP 7.1。你可以看到超過 40% 的用戶仍然使用 PHP 5.6,更可怕的是超過 39% 的用戶在使用已經不支援的 PHP 版本。截至 2016 年 12 月,WordPress.org 為 PHP 5.6 版本的使用者修改 官方建議 為建議使用 PHP 7 或以上的版本。
WordPress PHP 7.1 stats

WordPress PHP 7.1 數據統計

以上的數據表現並不令人愉悅,因為看起來 PHP 7 好像更快點。以下是一些統計:

  • PHP 官方基準測試 顯示 PHP 7 允許系統每秒執行2次請求,與 PHP 5.6 相比,幾乎只是一般的延遲。

  • Christian Vigh 也發布了一個 PHP 效能測試對比 他發現 PHP 5.2 比 PHP 7 慢了將近 400%。

我們在 2018 執行了效能基準測試 PHP 5.6 vs PHP 7 vs HHVM。與上述基準測試類似,我們發現 PHP 7.2 與 PHP 5.6 相比每秒可執行幾乎三倍數量的交易(請求)。

WordPress benchmarks

WordPress 基準測試

  • WordPress 4.9.4 PHP 5.6 基準測試結果: 49.18 req/sec

  • WordPress 4.9.4 PHP 7.0 基準測試結果: 133.55 req/sec

  • WordPress 4.9.4 PHP 7.1 基準測試結果:134.24 req/sec

  • #WordPress 4.9.4 PHP 7.2 基準測試結果:148.80 req/sec ��

  • WordPress 4.9.4 HHVM 基準測試結果:144.76 req/sec

許多東西在僅僅在更新上比較慢,因為要花時間去參與測試所有新的第三方外掛程式和主題確保它們可以正常運作。很多時候,慢是因為它們還沒完成。不確定你執行的 PHP 是什麼版本?其中一個很簡單的方法就是使用這個工具  Pingdom  或 Google Chrome開發工具。第一個 HTTP 請求頭一般將會展示你的版本。

Check version of PHP

檢查 PHP 版本

這將依賴主機不修改 X-Powered-By 頭資訊的值。如果修改了的話,你可能就看不到 PHP 的版本資訊了,這種情況下你需要 透過 FTP 上傳檔案.。或者你總是去詢問主機。

升級到 PHP 7.2

PHP 7.2 還有一部分沒完成,但可以先嚐嚐鮮。你可以 測試你的 WordPress 本機網站 或在類似 Docker 環境中檢查你的腳本,你可以在命令列中測試比較不同的 PHP 版本。

結語

準備好切換到 PHP 7.2 了嗎?不過至少希望你先已經過渡到 PHP 7 以上的版本了。如果你現在還沒準備好測試的話,那麼,升級你的腳本,檢查你的程式碼,說說你對 PHP 7.2 的首次體驗。

相關推薦:

windows 下編譯php7.2 極度擴充 judy

#

linux如何安裝php7.2

CentOS7yum安裝PHP7.2實例方法

以上是PHP 7.2 新功能介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

See all articles