摘要:這次發(fā)布包含新特性功能,及優(yōu)化,以讓我們寫(xiě)出更好的代碼。安全性改進(jìn)密碼哈希中的是榮獲年密碼哈希算法比賽中的冠軍的強(qiáng)大哈希算法,將其作為安全算法的替代品。是一個(gè)跨平臺(tái)和跨語(yǔ)言的庫(kù),用于加密,解密,簽名,密碼哈希等。中函數(shù)已被取代。
PHP 7.2?已經(jīng)在 2017 年 11 月 30 日 正式發(fā)布 。這次發(fā)布包含新特性、功能,及優(yōu)化,以讓我們寫(xiě)出更好的代碼。在這篇文章裡,我將會(huì)介紹一些 PHP 7.2 最有趣的語(yǔ)言特性。
你可以在 Requests For Comments 頁(yè)面查看完整的更動(dòng)清單。
核心改進(jìn) 參數(shù)類型聲明從 PHP5 起,我們可以指定函數(shù)參數(shù)的預(yù)期聲明類型。如果傳參類型錯(cuò)誤,PHP 就會(huì)拋出一個(gè)錯(cuò)誤。
參數(shù)類型聲明?(也稱類型提示) 指定預(yù)期要傳參給函數(shù)或者類方法的參數(shù)類型。
這里有個(gè)例子:
class MyClass { public $var = "Hello World"; } $myclass = new MyClass; function test(MyClass $myclass){ return $myclass->var; } echo test($myclass);
在這段代碼中,測(cè)試函數(shù)需要一個(gè) MyClass 實(shí)例。不正確的參數(shù)數(shù)據(jù)類型會(huì)導(dǎo)致一個(gè)致命錯(cuò)誤。
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?類型提示?可以被用在對(duì)象型數(shù)據(jù)上,并且這個(gè)改進(jìn)允許通用對(duì)象類型作為一個(gè)函數(shù)或者方法的參數(shù)。這里有個(gè)例子:
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);
在以上示例中,我們調(diào)用了兩次測(cè)試函數(shù),每次都傳遞一個(gè)不同的對(duì)象。這在之前的 PHP 版本中是前所未有的。
在 Docker 中測(cè)試 PHP 7.0 和 PHP 7.2 的類型提示。
對(duì)象返回類型聲明若變量類型指定函數(shù)參數(shù)的預(yù)期類型,返回值類型同樣也可以被指定預(yù)期類型。
返回類型聲明?指定一個(gè)函數(shù)應(yīng)該返回的預(yù)期類型。
PHP 7.2 起,對(duì)象數(shù)據(jù)類型可以使用返回類型聲明。這里有個(gè)例子:
class MyClass { public $var = "Hello World"; } $myclass = new MyClass; function test(MyClass $arg) : object { return $arg; } echo test($myclass)->var;
之前的 PHP 版本會(huì)拋出以下致命錯(cuò)誤:
Fatal error: Uncaught TypeError: Return value of test() must be an instance of object, instance of MyClass returned in /app/index.php:10
當(dāng)然,PHP 7.2 的代碼會(huì)打印出?"Hello World"。
參數(shù)類型泛化PHP 目前是不允許子類和它父類或者接口的參數(shù)類型有任何差異的。 這是什么意思呢?
參考下以下代碼:
這里我們省略了子類中的參數(shù)類型。 在 PHP 7.0 中,會(huì)產(chǎn)生以下警告:
Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8從 PHP 7.2 起,我們可以忽略子類中的類型?而不會(huì)破壞任何代碼。這個(gè)方案使得我們可以在庫(kù)中升級(jí)類,從而可以使用類型提示,卻無(wú)需更新其所有的子類。
列表語(yǔ)法中的尾隨逗號(hào)在 PHP 數(shù)組的最后一個(gè)元素上使用尾隨逗號(hào)是?合法語(yǔ)法?,并且?有時(shí)候鼓勵(lì)這么做?,可以很輕松的避免增加新元素的時(shí)候出現(xiàn)缺失逗號(hào)的錯(cuò)誤。 從 PHP 7.2?在 分組命名空間 中,我們可以使用尾隨逗號(hào)?。
參閱 列表語(yǔ)法中的尾隨逗號(hào)?獲得 RFC 的直觀感知和一些示例代碼。
安全性改進(jìn) 密碼哈希中的Argon2Argon2?是榮獲 2015 年密碼哈希算法比賽中的冠軍的強(qiáng)大哈希算法, PHP 7.2 將其作為安全 ?Bcrypt 算法的替代品。
新版的 PHP 中引入了?PASSWORD_ARGON2I?常量,現(xiàn)在可以在?password_*?系列函數(shù)中使用:password_hash("password", PASSWORD_ARGON2I);與只使用一個(gè) cost 因子的 Bcrypt 不同, Argon2 使用三個(gè) cost 因子 區(qū)分如下:
定義哈希計(jì)算期間應(yīng)該消耗的KiB數(shù)量的內(nèi)存開(kāi)銷(默認(rèn)值為1 << 10或1024 KiB或1 MiB)
定義哈希算法迭代次數(shù)的時(shí)間開(kāi)銷(默認(rèn)值為2)
并行因子,用于設(shè)置哈希計(jì)算時(shí)使用的并行線程數(shù)(缺省值為2)
以下三個(gè)新常量定義了默認(rèn)的 cost 因子:
PASSWORD_ARGON2_DEFAULT_MEMORY_COST
PASSWORD_ARGON2_DEFAULT_TIME_COST
PASSWORD_ARGON2_DEFAULT_THREADS
這里有個(gè)例子:
$options = ["memory_cost" => 1<<11, "time_cost" => 4, "threads" => 2]; password_hash("password", PASSWORD_ARGON2I, $options);查閱?Argon2 密碼哈希?的更多信息。
Libsodium 成為 PHP 核心的組成部分從 7.2 版開(kāi)始,PHP 在其核心中涵蓋了?Sodium library?。?Libsodium?是一個(gè)跨平臺(tái)和跨語(yǔ)言的庫(kù),用于加密,解密,簽名,密碼哈希等。
棄用
這個(gè)庫(kù)之前是?通過(guò) PECL 來(lái)提供的。
有關(guān) Libsodium 函數(shù)列表,參閱?快速入門(mén)。
也可參閱?PHP 7.2: 第一個(gè)將現(xiàn)代加密技術(shù)添加到其標(biāo)準(zhǔn)庫(kù)的編程語(yǔ)言。這里有個(gè) PHP 7.2?棄用函數(shù)和特性?清單,PHP 8.0 之后將全部移除。
PHP 5.1 中 __autoload?函數(shù)已被?spl_autoload_register?取代。現(xiàn)在會(huì)在編譯期間報(bào)一個(gè)棄用通知。
當(dāng)拋出致命錯(cuò)誤的時(shí)候,會(huì)創(chuàng)建 $php_errormsg?局部變量。 PHP 7.2?中應(yīng)該使用 error_get_last?和?error_clear_last?替代這種做法。
create_function()?可以創(chuàng)建一個(gè)具有函數(shù)名稱的函數(shù),將函數(shù)參數(shù)和函數(shù)體作為該函數(shù)的列表傳入。因?yàn)榘踩珕?wèn)題和性能表現(xiàn)不佳,它被標(biāo)記為棄用,鼓勵(lì)用封裝替代。
mbstring.func_overload?ini 設(shè)置為非零值已經(jīng)被標(biāo)記為棄用。
(unset) cast?是個(gè)總是返回 null 的表達(dá)式,并且毫無(wú)用處。
如果傳入第二個(gè)參數(shù),parse_str()?將查詢字符串解析到數(shù)組當(dāng)中, 否則解析到本地符號(hào)表。 因?yàn)榘踩颍?不建議 在函數(shù)作用域中動(dòng)態(tài)設(shè)置變量,使用不帶第二個(gè)參數(shù)的 parse_str() 將拋一個(gè)棄用通知。
gmp_random()?是平臺(tái)相關(guān)的,將會(huì)被廢棄。使用 gmp_random_bits()?和?gmp_random_rage()?代替。
each() 在數(shù)組上迭代的行為非常像?foreach(),但 foreach()?基于一些原因而成為更優(yōu)選擇,例如它的速度快上 10 倍。現(xiàn)在在循環(huán)中使用前者將會(huì)拋出一個(gè)廢棄提示。
?assert()?函數(shù)檢查給定的斷言,并在結(jié)果為 FALSE 的時(shí)候進(jìn)行相關(guān)處理。 帶有字符串參數(shù)的 assert() 現(xiàn)在已經(jīng)棄用,因?yàn)樗?RCE 漏洞。?zend.assertion?ini 選項(xiàng)可以關(guān)閉斷言表達(dá)式。
$errcontext?是一個(gè)包含產(chǎn)生錯(cuò)誤時(shí)的局部變量數(shù)組。它可被作為錯(cuò)誤處理程序?set_error_handler()?函數(shù)的最后一個(gè)參數(shù)。
PHP 7.2 對(duì) WordPress 用戶意味著什么?根據(jù)官方?WordPress 統(tǒng)計(jì)頁(yè) 所示,截至撰寫(xiě)本文時(shí),只有 19.8% 的 WordPress 用戶升級(jí)到了 PHP 7。只有 5%使用?PHP 7.1。你可以看到超過(guò) 40% 的用戶仍然使用 PHP 5.6,更可怕的是超過(guò) 39% 的用戶在使用已經(jīng)不受支持的 PHP 版本。截至 2016 年 12 月,WordPress.org?為 PHP 5.6 版本的用戶修改 官方建議?為建議使用 PHP 7 或以上的版本。
WordPress PHP 7.1 數(shù)據(jù)統(tǒng)計(jì)
以上的數(shù)據(jù)表現(xiàn)并不令人愉悅,因?yàn)榭瓷先?PHP 7 好像更快點(diǎn)。下面是一些統(tǒng)計(jì)數(shù)據(jù):
PHP?官方 基準(zhǔn)測(cè)試?顯示 PHP 7 允許系統(tǒng)每秒執(zhí)行2次請(qǐng)求,與 PHP 5.6 相比,幾乎只是一般的延遲。
Christian Vigh 也發(fā)布了一個(gè)?PHP 性能測(cè)試對(duì)比?他發(fā)現(xiàn) PHP 5.2 比 PHP 7 慢了近 400%。
我們?cè)?2018 運(yùn)行了性能基準(zhǔn)測(cè)試?PHP 5.6 vs PHP 7 vs HHVM。與上述基準(zhǔn)測(cè)試類似,我們發(fā)現(xiàn) PHP 7.2 與 PHP 5.6 相比每秒可執(zhí)行幾乎三倍數(shù)量的事務(wù)(請(qǐng)求)。
WordPress 基準(zhǔn)測(cè)試
WordPress 4.9.4 PHP 5.6 基準(zhǔn)測(cè)試結(jié)果:?49.18 req/sec
WordPress 4.9.4 PHP 7.0 基準(zhǔn)測(cè)試結(jié)果: 133.55 req/sec
WordPress 4.9.4 PHP 7.1 基準(zhǔn)測(cè)試結(jié)果:134.24 req/sec
WordPress 4.9.4?PHP 7.2 基準(zhǔn)測(cè)試結(jié)果:148.80 req/sec??
WordPress 4.9.4 HHVM 基準(zhǔn)測(cè)試結(jié)果:144.76 req/sec
許多東西在僅僅在更新上比較慢,因?yàn)橐〞r(shí)間去參與測(cè)試所有新的第三方插件和主題確保它們可以正常運(yùn)行。很多時(shí)候,慢是因?yàn)樗鼈冞€沒(méi)完成。不確定你運(yùn)行的 PHP 是什么版本?其中一個(gè)很最簡(jiǎn)單的方法就是使用這個(gè)工具 ?Pingdom? 或者 Google Chrome開(kāi)發(fā)工具.。第一個(gè) HTTP 請(qǐng)求頭一般將會(huì)展示你的版本。
檢查 PHP 版本
這將依賴于主機(jī)不修改 X-Powered-By 頭信息的值。如果修改了的話,你可能就看不到 PHP 的版本信息了,這種情況下你需要?通過(guò) FTP 上傳文件.。或者你總是去詢問(wèn)主機(jī)。
升級(jí)到?PHP 7.2PHP 7.2 還有一部分沒(méi)完成,但是你可以先嘗嘗鮮。你可以?測(cè)試你的 WordPress 本地站點(diǎn)?或者在類似?Docker 環(huán)境中檢查你的腳本,你可以在命令行中測(cè)試比較不同的 PHP 版本。
結(jié)語(yǔ)準(zhǔn)備好切換到 PHP 7.2 了嗎?不過(guò)至少希望你首先已經(jīng)過(guò)渡到了 PHP 7 以上的版本了。如果你現(xiàn)在還沒(méi)準(zhǔn)備好測(cè)試的話,那么,升級(jí)你的腳本,檢查你的代碼,說(shuō)說(shuō)你對(duì) PHP 7.2 的首次體驗(yàn)。
更多現(xiàn)代化 PHP 知識(shí),請(qǐng)前往 Laravel / PHP 知識(shí)社區(qū)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/28606.html
摘要:在這篇文章中,我將介紹一些中最有趣的語(yǔ)言特性參數(shù)類型聲明。參數(shù)類型聲明也稱為類型提示指定預(yù)期傳遞給函數(shù)或類方法的變量的類型。參數(shù)類型寬限聲明目前不允許子類和它們的父類或接口之間的參數(shù)類型有任何差異。 PHP 7.2已于 11月30日正式發(fā)布,該版本具有新特性,功能和改進(jìn),可以讓我們編寫(xiě)更好的代碼。在這篇文章中,我將介紹一些PHP 7.2中最有趣的語(yǔ)言特性-參數(shù)類型聲明。 參數(shù)類型聲明 ...
摘要:說(shuō)明目前中,計(jì)劃于月日發(fā)布。安全改進(jìn)密碼哈希中的是一個(gè)強(qiáng)大的哈希算法,被選為年密碼哈希大賽的冠軍,將它作為算法的安全替代品。已將設(shè)置為非零值已被標(biāo)記為已棄用。被認(rèn)為是平臺(tái)相關(guān)的,將被棄用。 說(shuō)明 目前RC3中,PHP 7.2計(jì)劃于11月30日發(fā)布。新版本將提供新的特性,功能和改進(jìn),使我們能夠編寫(xiě)更好的代碼。在這篇文章中,我將介紹一些PHP 7.2中最有趣的語(yǔ)言特性。 參數(shù)類型聲明 從P...
摘要:測(cè)試運(yùn)行多次并取平均值。文章數(shù)量測(cè)試的基準(zhǔn)測(cè)試基準(zhǔn)測(cè)試結(jié)果基準(zhǔn)測(cè)試結(jié)果基準(zhǔn)測(cè)試結(jié)果基準(zhǔn)測(cè)試結(jié)果基準(zhǔn)測(cè)試結(jié)果基準(zhǔn)測(cè)試結(jié)果不支持再次成為冠軍請(qǐng)注意的運(yùn)行環(huán)境需要或以上。同時(shí),再次不能正常工作并拋出錯(cuò)誤。 showImg(https://segmentfault.com/img/remote/1460000013690286); 我們每年都會(huì)嘗試深入了解不同版本的 PHP 和 HHVM 在各...
摘要:本文將介紹如何在服務(wù)器上使用命令安裝,內(nèi)容提煉自外文網(wǎng)站,點(diǎn)擊查看原文。 本文將介紹如何在 CentOS 7 服務(wù)器上使用 yum 命令安裝 PHP7.2,內(nèi)容提煉自外文網(wǎng)站,點(diǎn)擊查看原文。 安裝 PHP7.2 安裝 EPEL 軟件包: $ sudo yum install epel-release 安裝 remi 源: $ sudo yum install http://rpms.r...
摘要:直接強(qiáng)制結(jié)束程序。在用掛起程序時(shí),當(dāng)想要結(jié)束這個(gè)程序,最好用。能夠模擬在控制臺(tái)結(jié)束程序的功能。 向 host 文件快速添加新網(wǎng)址配置 echo 127.0.0.1 your.domian.com | sudo tee -a /etc/hosts NGINX 配置 #nginx禁止訪問(wèn).點(diǎn)號(hào)開(kāi)頭的文件 location ~* /.* { deny all; } #nginx 禁止訪問(wèn).s...
閱讀 2556·2023-04-25 20:05
閱讀 2885·2023-04-25 17:56
閱讀 2195·2021-10-14 09:49
閱讀 2679·2019-08-29 15:10
閱讀 2922·2019-08-29 12:25
閱讀 416·2019-08-28 18:23
閱讀 756·2019-08-26 13:26
閱讀 1370·2019-08-23 18:21