更新使用了已弃用的 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 or 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()
循环替代。