首頁  >  文章  >  後端開發  >  PHP 7.2 新功能介紹

PHP 7.2 新功能介紹

不言
不言原創
2018-05-24 14:47:033327瀏覽

本篇文章给大家分享的内容是关于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

  • 定义哈希算法迭代次数的时间开销(默认值为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