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