更新使用了已棄用的 each() 函數的程式碼的方法
P粉883223328
P粉883223328 2023-08-22 11:44:11
0
2
665
<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>
P粉883223328
P粉883223328

全部回覆(2)
P粉463418483

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. 安裝

composer require rector/rector --dev

2. 建立rector.php設定檔

vendor/bin/rector init

3. 新增PHP_72集合

<?php

use Rector\Core\Configuration\Option;
use Rector\Set\ValueObject\SetList;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

return static function (ContainerConfigurator $containerConfigurator): void {
    $parameters->set(Option::SETS, [
        Setlist::PHP_72,
    ]);
};

4. 在你的程式碼上運行它

vendor/bin/rector process src --set php72

希望它對你的遷移有幫助。


如果有任何錯誤或異常,那是Rector錯過的情況。 建立一個問題,這樣我們就可以修復它,並使其適用於所有可能的情況。

P粉982881583
  1. 對於你的前兩個範例案例,你可以使用 key()current() 來指派你所需要的值。

    $ar = $o->me;   // 重置不是必需的,因为你刚刚创建了数组
    $typ = key($ar);
    $val = current($ar);
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = [key($out), current($out)];

    在這些情況下,你可以使用 next() 在之後推進遊標,但如果你的其餘程式碼不依賴它,這可能是不必要的。

  3. 對於第三種情況,我建議你只是使用一個 foreach() 循環,並在循環內部分配 $kv

    foreach ($broken as $k => $v) {
         $kv = [$k, $v];
    }
  4. 對於第四種情況,在 list() 中似乎忽略了鍵,所以你可以指派目前值。

    $this->result = current($this->cache_data);

    就像前兩種情況一樣,根據你的其餘程式碼如何與 $this->cache_data 交互,可能需要使用 next() 推進遊標。

  5. 第五種情況可以用 for() 迴圈來取代。

    reset($array);
    for ($i = 0; $i < 30; $i++) {
        $id = key($array);
        $item = current($array);
        // 代码
        next($array);
    }
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板