使用PHP 7.2,each函數已被棄用。文檔中提到:
警告 從PHP 7.2.0開始,該函數已被棄用。強烈不建議依賴該函數。
如何更新我的程式碼以避免使用它?以下是一些範例:
$ar = $o->me; reset($ar); list($typ, $val) = each($ar);
$out = array('me' => array(), 'mytype' => 2, '_php_class' => null); $expected = each($out); for(reset($broken);$kv = each($broken);) {...} list(, $this->result) = each($this->cache_data);
// iterating to the end of an array 或 a limit > the length of the array $i = 0; reset($array); while( (list($id, $item) = each($array)) || $i < 30 ) { // code $i ; } 當我在PHP 7.2上執行程式碼時,會收到以下錯誤:
已棄用:each()函數已被棄用。此訊息將在進一步呼叫時被忽略
2019 即時升級
each()#實際上有很多情況下可以替換
each(),這就是為什麼在這個問題中有這麼多不同的被贊同的答案。-while (list($key, $callback) = each($callbacks)) { +foreach ($callbacks as $key => $callback) { // ... }還有:
-while (list($key) = each($callbacks)) { +foreach (array_keys($callbacks) as $key) { // ... }你可以手動一個一個地替換。但是沒有更好的方法嗎?
我幫忙遷移項目,有150多個這樣的情況。我很懶,所以我做了一個叫做Rector的工具,可以將程式碼轉換成上述的方式(還有更多情況,但我不想在答案中垃圾郵件) 。
它是
PHP_72集合的一部份。升級程式碼的4個步驟
1. 安裝
2. 建立
rector.php設定檔3. 新增
PHP_72集合4. 在你的程式碼上運行它
希望它對你的遷移有幫助。
如果有任何錯誤或異常,那是Rector錯過的情況。建立一個問題,這樣我們就可以修復它,並使其適用於所有可能的情況。
對於你的前兩個範例案例,你可以使用
key()和current()來指派你所需要的值。$out = array('me' => array(), 'mytype' => 2, '_php_class' => null); $expected = [key($out), current($out)];在這些情況下,你可以使用
next()在之後推進遊標,但如果你的其餘程式碼不依賴它,這可能是不必要的。對於第三種情況,我建議你只是使用一個
foreach()循環,並在循環內部分配$kv。foreach ($broken as $k => $v) { $kv = [$k, $v]; }對於第四種情況,在
list()中似乎忽略了鍵,所以你可以指派目前值。就像前兩種情況一樣,根據你的其餘程式碼如何與
$this->cache_data交互,可能需要使用next()推進遊標。第五種情況可以用
for()迴圈來取代。reset($array); for ($i = 0; $i < 30; $i++) { $id = key($array); $item = current($array); // 代码 next($array); }