首頁  >  問答  >  主體

更新使用了已棄用的 each() 函數的程式碼的方法

<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粉883223328P粉883223328447 天前655

全部回覆(2)我來回復

  • P粉463418483

    P粉4634184832023-08-23 09:19:01

    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錯過的情況。 建立一個問題,這樣我們就可以修復它,並使其適用於所有可能的情況。

    回覆
    0
  • P粉982881583

    P粉9828815832023-08-23 00:06:26

    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);
      }

    回覆
    0
  • 取消回覆