如何在每个php中解决这个不推荐使用的函数
在PHP7.2中,如何在每个php中解决这个不推荐使用的函数,php,Php,在PHP7.2中,每个都不推荐使用。说: 警告从PHP 7.2.0开始,此函数已被弃用。非常不鼓励依赖此功能 如何更新代码以避免使用它?以下是一些例子: //迭代到数组末尾或限制>数组长度 $i=0; 重置($阵列); while((列表($id,$item)=每个($array))| |$i
每个都不推荐使用。说:
警告从PHP 7.2.0开始,此函数已被弃用。非常不鼓励依赖此功能
如何更新代码以避免使用它?以下是一些例子:
//迭代到数组末尾或限制>数组长度
$i=0;
重置($阵列);
while((列表($id,$item)=每个($array))| |$i<30){
//代码
$i++;
}
您可以使用和创建自己的each()
函数。然后用该函数替换调用,如下所示:
<?php
function myEach(&$arr) {
$key = key($arr);
$result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
next($arr);
return $result;
}
二,
三,
对于前两个示例,可以使用key()
和current()
来分配所需的值
$ar = $o->me; // reset isn't necessary, since you just created the array
$typ = key($ar);
$val = current($ar);
在这些情况下,您可以使用next()
在之后推进光标,但如果其余代码不依赖于此,则可能不需要这样做
对于第三种情况,我建议只使用foreach()
循环,并在循环内分配$kv
foreach ($broken as $k => $v) {
$kv = [$k, $v];
}
对于第四种情况,似乎在list()
中忽略了键,因此可以指定当前值
$this->result = current($this->cache_data);
与前两种情况一样,可能需要使用next()
推进光标,这取决于代码的其余部分如何与$this->cache_data
交互
第五个可以替换为for()
循环
reset($array);
for ($i = 0; $i < 30; $i++) {
$id = key($array);
$item = current($array);
// code
next($array);
}
reset($array);
对于($i=0;$i<30;$i++){
$id=键($array);
$item=当前($array);
//代码
下一个($数组);
}
更新
reset($array);
foreach($array as $key => $value) {
您绝对不应该这样做的方式是将函数“返回到php”添加到php.ini中的auto_prepend_文件设置中
auto_prepend_file = "/var/www/php/auto_prepend.php"
然后创建文件并使用函数包装器输入函数
<?php
/**
* Adds the depreciated each() function back into 7.2
*/
if (!function_exists('each')) {
function each($arr) {
$key = key($arr);
$result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
next($arr);
return $result;
}
}
使用这个函数怎么样
function array_fetch(array $a) {
$element = current($a);
next($a);
return $element;
}
2019+即时升级each()
为
实际上有很多情况下,each()
都可以被替换,这就是为什么在这个问题上有这么多不同的向上投票的答案
-while (list($key, $callback) = each($callbacks)) {
+foreach ($callbacks as $key => $callback) {
// ...
}
以及:
您可以手动逐个替换。但是没有更好的办法吗
我帮助迁移项目,其中有150多个这样的案例。我很懒,所以我制作了一个名为的工具,它可以按照上面的方式转换代码(+还有更多的情况,但我不想垃圾发布答案)
它是PHP_72
集合的一部分
升级代码的4个步骤
1.安装它
2.创建rector.php
config
3.添加PHP_72
set
我希望它能帮助您完成迁移
如果有什么错误或异常,那就是校长错案了,因此,我们可以修复它并使其适用于每种情况。如果您想完全模拟每种情况,我想您需要在输出中使用“键”和“值”键以及0和1。@不要使用编辑过的NIC答案,这种情况不需要它,但可能会有其他情况。感谢您的建议。请务必注意,这些值并不等效,尽管在大多数情况下,foreach就足够了–如果您在while循环中修改$array
,它将迭代修改后的值foreach
创建列表的副本并对其进行迭代,因此对$array
的突变不会改变循环。@jpschroeder这是正确的。另外,对于foreach,重置是不必要的。在foreach之前重置大部分是usless。这是完全不同的功能。。。不能在递归中使用。对于4.,我认为将list($a,$b)=each($arr)
替换为list($a,$b)=数组(key($arr),current($arr));其次($arr)代码>不是吗?@Metal3d是的,应该是等效的。虽然就我个人而言,我不会使用list,但我只会使用key()和current()直接分配给$a和$b。我知道这还需要一行代码,但它似乎比创建数组用list()将值取回来更简单。不过,这只是我的意见。:-)请参阅下面的universal automated migration version(通用自动迁移版本):对于案例1,我认为您需要确保调用current()后内部指针处于高级状态,因为它不会移动指针。最后一个使用key()和current()的示例在值方面是正确的,但忽略了这样一个事实,即每个()都会作为副作用推进数组光标。另外,在list()调用中,您可能指的是$val,而不是$callback。适当的替换是:-列表($key,$val)=每个($callbacks)+$键=键($opt->option)+$val=当前($opt->option)+下一步(回调);你能为它创建一个问题,这样它就被修复了吗?我没有使用那个库,我只是在谷歌上搜索一个each()替换项,在这里找到了你的帖子,发现它很有用,但我想我会指出这个小遗漏,这样你就可以更正你的帖子了。我明白了。在Github回购协议中,仍然可以更好地解决这一问题。维护人员很少访问他们以前的响应,错误通常会更多people@Nils我已经更新了示例。从内联代码中读取文本注释是非常困难的,这样会更好。你能检查一下吗?这看起来像是xmlrpc库中的东西。我也不得不去修复一些东西,哈哈。是的,它被弃用了,没有什么令人信服的原因,只是让人们改变他们的代码,却什么也得不到。PHP世界的另一个挫折。在我的例子中,替换函数运行到一个无止境的循环中。可能是因为它没有考虑到reset()
和next()
$out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
$expected = [key($out), current($out)];
foreach ($broken as $k => $v) {
$kv = [$k, $v];
}
$this->result = current($this->cache_data);
reset($array);
for ($i = 0; $i < 30; $i++) {
$id = key($array);
$item = current($array);
// code
next($array);
}
reset($array);
while (list($key, $value) = each($array)) {
reset($array);
foreach($array as $key => $value) {
auto_prepend_file = "/var/www/php/auto_prepend.php"
<?php
/**
* Adds the depreciated each() function back into 7.2
*/
if (!function_exists('each')) {
function each($arr) {
$key = key($arr);
$result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
next($arr);
return $result;
}
}
function array_fetch(array $a) {
$element = current($a);
next($a);
return $element;
}
-while (list($key, $callback) = each($callbacks)) {
+foreach ($callbacks as $key => $callback) {
// ...
}
-while (list($key) = each($callbacks)) {
+foreach (array_keys($callbacks) as $key) {
// ...
}
composer require rector/rector --dev
vendor/bin/rector init
<?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,
]);
};
vendor/bin/rector process src --set php72