摘要:說明目前中,計劃于月日發(fā)布。安全改進(jìn)密碼哈希中的是一個強大的哈希算法,被選為年密碼哈希大賽的冠軍,將它作為算法的安全替代品。已將設(shè)置為非零值已被標(biāo)記為已棄用。被認(rèn)為是平臺相關(guān)的,將被棄用。
說明
目前RC3中,PHP 7.2計劃于11月30日發(fā)布。新版本將提供新的特性,功能和改進(jìn),使我們能夠編寫更好的代碼。在這篇文章中,我將介紹一些PHP 7.2中最有趣的語言特性。
參數(shù)類型聲明從PHP 5開始,我們可以在函數(shù)的聲明中指定期望傳遞的參數(shù)類型。如果給定的值是不正確的類型,那么PHP會拋出一個錯誤。參數(shù)類型聲明(也稱為類型提示)指定預(yù)期要傳遞給函數(shù)或類方法的變量的類型。
例如下面這個例子:
class MyClass { public $var = "Hello World"; } $myclass = new MyClass; function test(MyClass $myclass){ return $myclass->var; } echo test($myclass);
在這個代碼中,測試函數(shù)需要MyClass的一個實例。不正確的數(shù)據(jù)類型將導(dǎo)致以下致命錯誤:
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 類型提示可以與對象數(shù)據(jù)類型一起使用,并且這種改進(jìn)允許聲明通用對象作為函數(shù)或方法的參數(shù)。這里是一個例子:
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)用了兩次測試函數(shù),每次調(diào)用都傳遞一個不同的對象。在以前的PHP版本中這是不可能的。
Docker命令
在Docker中使用PHP 7.0和PHP 7.2測試類型提示
如果參數(shù)類型聲明指定函數(shù)參數(shù)的預(yù)期類型,則返回類型聲明指定返回值的預(yù)期類型。
返回類型聲明指定了一個函數(shù)應(yīng)該返回的變量的類型。
從PHP 7.2開始,我們被允許為對象數(shù)據(jù)類型使用返回類型聲明。這里是一個例子:
class MyClass { public $var = "Hello World"; } $myclass = new MyClass; function test(MyClass $arg) : object { return $arg; } echo test($myclass)->var;
以前的PHP版本會導(dǎo)致以下致命錯誤:
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中,這個代碼回應(yīng)了“Hello World”。
參數(shù)類型加寬PHP目前不允許子類和它們的父類或接口之間的參數(shù)類型有任何差異。這意味著什么?
考慮下面的代碼:
這里我們省略了子類中的參數(shù)類型。在PHP 7.0中,這段代碼會產(chǎn)生以下警告:
Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8自PHP 7.2以來,我們被允許在不破壞任何代碼的情況下省略子類中的類型。這個建議將允許我們升級類來在庫中使用類型提示,而不需要更新所有的子類。
在列表語法中尾隨逗號數(shù)組中最后一項之后的尾隨逗號是PHP中的有效語法,有時為了方便追加新項目并避免由于缺少逗號而導(dǎo)致解析錯誤,鼓勵使用該語法。自PHP 7.2以來,我們被允許在分組命名空間中使用尾隨逗號。
請參閱列表語法中的尾隨逗號以便在此RFC處獲得更近的視圖以及一些代碼示例。
安全改進(jìn) 密碼哈希中的Argon2Argon2是一個強大的哈希算法,被選為2015年密碼哈希大賽的冠軍,PHP 7.2將它作為Bcrypt算法的安全替代品。
新的PHP版本引入了PASSWORD_ARGON2I常量,現(xiàn)在可以在password_*函數(shù)中使用它:password_hash("password", PASSWORD_ARGON2I);與僅使用一個成本因素的Bcrypt不同,Argon2需要三個成本因素區(qū)分如下:
甲存儲器成本它定義了應(yīng)散列期間被消耗KIB的數(shù)(默認(rèn)值是1 << 10,或1024 KIB,或1 MIB)
甲時間成本定義散列算法的迭代次數(shù)(默認(rèn)為2)
一個并行因子,用于設(shè)置散列期間將使用的并行線程數(shù)(缺省值為2)
三個新的常量定義了默認(rèn)的成本因素:
PASSWORD_ARGON2_DEFAULT_MEMORY_COST
PASSWORD_ARGON2_DEFAULT_TIME_COST
PASSWORD_ARGON2_DEFAULT_THREADS
這里是一個例子:
$options = ["memory_cost" => 1<<11, "time_cost" => 4, "threads" => 2]; password_hash("password", PASSWORD_ARGON2I, $options);有關(guān)更多信息,請參閱Argon2密碼哈希。
Libsodium作為PHP Core的一部分從版本7.2開始,PHP將鈉庫納入核心。Libsodium 是一個跨平臺和跨語言的庫,用于加密,解密,簽名,密碼散列等等。以前通過 PECL 提供。有關(guān)Libsodium功能的文檔列表,請參閱庫快速入門指南。另請參閱PHP 7.2:將現(xiàn)代加密技術(shù)添加到其標(biāo)準(zhǔn)庫中的第一種編程語言。
棄用以下是PHP 8.0 不推薦使用的函數(shù)和功能列表,不晚于PHP 8.0:
該__autoload功能已被取代由spl_autoload_register在PHP 5.1?,F(xiàn)在,在編譯期間遇到棄用通知。
在$ php_errormsg中時,拋出一個非致命錯誤變量是在局部范圍內(nèi)創(chuàng)建。由于應(yīng)該使用PHP 7.2 error_get_last和error_clear_last。
create_function()允許創(chuàng)建一個帶有生成函數(shù)名稱的函數(shù),一系列參數(shù)和正文代碼作為參數(shù)提供。由于安全問題和性能不佳,已將其標(biāo)記為已棄用,并鼓勵使用附件。
已將 mbstring.func_overload ini設(shè)置為非零值已被標(biāo)記為已棄用。
(unset)cast 是一個總是返回null的表達(dá)式,被認(rèn)為是無用的。
如果提供了第二個參數(shù),parse_str()會將查詢字符串解析為數(shù)組,如果不使用,則解析為本地符號表。由于出于安全原因不鼓勵在函數(shù)范圍內(nèi)設(shè)置變量,使用不帶第二個參數(shù)的 parse_str() 將拋出棄用通知。
gmp_random() 被認(rèn)為是平臺相關(guān)的,將被棄用。使用 gmp_random_bits() 和 gmp_random_rage()來代替。
each() 被用來像 foreach() 那樣迭代一個數(shù)組,但是 foreach() 有幾個原因是可取的,包括快10倍?,F(xiàn)在,在循環(huán)的第一個呼叫中將會拋棄。
所述斷言函數(shù)檢查給定的斷言,并采取適當(dāng)?shù)男袆?,如果結(jié)果是FALSE。帶有字符串參數(shù)的 assert() 的使用現(xiàn)在已被棄用,因為它會打開一個 RCE 漏洞。該 zend.assertion INI 選項可用于防止斷言表達(dá)式的評價。
$ errcontext是包含生成錯誤時存在的局部變量的數(shù)組。它作為使用 set_error_handler() 函數(shù)設(shè)置的錯誤處理程序的最后一個參數(shù)傳遞。
結(jié)尾說明翻譯自 https://kinsta.com/blog/php-7-2/
Script Maker Day Day Up!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26202.html
摘要:風(fēng)格的構(gòu)造函數(shù)式構(gòu)造函數(shù),它與類的名稱相同,因為它們是在所定義類的方法,現(xiàn)在已過時,并且將在未來被移除。如果的構(gòu)造僅僅是一個類中定義構(gòu)造函數(shù),將發(fā)出。類實現(xiàn)構(gòu)造函數(shù)方法不受影響。 PHP7 - use語句 從PHP7起,單次使用 use 語句可以用來從同一個命名空間導(dǎo)入類,函數(shù)和常量(而不用多次使用 use 語句)。示例 PHP7 - 錯誤處理 從PHP7,錯誤處理和報告已經(jīng)改變。P...
摘要:背景前幾天在上跑,由于需要開啟多個進(jìn)程,多進(jìn)程需要擴展的支持,我之前那個安裝的沒有這個擴展,就直接卸載了,然后想下載源碼編譯安裝的更高版本,也可以更自由的安裝擴展。 背景 前幾天在mac上跑workrman,由于workerman需要開啟多個進(jìn)程,多進(jìn)程需要pcntl擴展的支持,我之前那個brew安裝的php71沒有這個擴展,就直接卸載了php71,然后想下載源碼編譯安裝php7的更高...
摘要:今天在公司實現(xiàn)一個模塊功能時寫了如下代碼居然報錯在編譯階段就通不過了錯誤信息意思很明顯但我的代碼里面并不是一個表達(dá)式啊,這讓我百思不得其解我?guī)е苫笤诩依镏匦虑孟铝巳缟洗a,編譯通過正常運行查看版本而公司的開發(fā)機上運行的是那么,為什么 今天在公司實現(xiàn)一個模塊功能時寫了如下代碼: class ProductCategory { const TYPES = [ 1 ...
摘要:以上例程會輸出返回值類型聲明增加了對返回類型聲明的支持。整數(shù)除法函數(shù)從移植到可為空類型參數(shù)以及返回值的類型現(xiàn)在可以通過在類型前加上一個問號使之允許為空。對于函數(shù)來說,不是一個合法的返回值。對于返回值,子類可以拓寬父類的或?qū)ο蠓祷刂殿愋偷健? PHP5.5 ~ PHP7.2 新特性整理 官方文檔:http://php.net/manual/zh/appe... 一、從PHP 5.5.x ...
閱讀 2155·2023-04-26 00:23
閱讀 830·2021-09-08 09:45
閱讀 2451·2019-08-28 18:20
閱讀 2559·2019-08-26 13:51
閱讀 1612·2019-08-26 10:32
閱讀 1406·2019-08-26 10:24
閱讀 2043·2019-08-26 10:23
閱讀 2210·2019-08-23 18:10