使用PHP 7.2,不推荐使用each
。 The documentation说:
警告自PHP 7.2.0起,此功能已被弃用。非常不鼓励依赖此功能。
如何更新我的代码以避免使用它?以下是一些例子:
$ar = $o->me;
reset($ar);
list($typ, $val) = each($ar);
$out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
$expected = each($out);
for(reset($broken);$kv = each($broken);) {...}
list(, $this->result) = each($this->cache_data);
// 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++;
}
答案 0 :(得分:33)
对于前两个案例,您可以使用key
和current
来分配所需的值。
$ar = $o->me; // reset isn't necessary, since you just created the array
$typ = key($ar);
$val = current($ar);
$out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
$expected = [key($out), current($out)];
在这些情况下,您可以使用next
来推进光标,但如果其余代码并不依赖于此,则可能没有必要。
对于第三种情况,我建议只使用foreach循环并在循环内分配$kv
。
foreach ($broken as $k => $v) {
$kv = [$k, $v];
}
对于第四种情况,看起来list
中的密钥被忽略,因此您可以分配当前值。
$this->result = current($this->cache_data);
与前两种情况一样,可能需要使用next
推进游标,具体取决于代码的其余部分与$this->cache_data
的交互方式。
#5可以用for循环替换。
reset($array);
for ($i = 0; $i < 30; $i++) {
$id = key($array);
$item = current($array);
// code
next($array);
}
答案 1 :(得分:18)
您可以使用key(),current()和next()创建自己的private readonly CloudTable _cloudTable;
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(storageConnectionString);
TableRequestOptions tableRequestOptions = new TableRequestOptions { RetryPolicy = retryPolicy };
CloudTableClient cloudTableClient = cloudStorageAccount.CreateCloudTableClient();
cloudTableClient.DefaultRequestOptions = tableRequestOptions;
_cloudTable = cloudTableClient.GetTableReference(tableName);
_cloudTable.CreateIfNotExists();
功能。然后用这个函数替换你的调用,如:
each()
1
<?php
function myEach(&$arr) {
$key = key($arr);
$result = ($key === null) ? false : [$key, current($arr), 'key' => $key, 'value' => current($arr)];
next($arr);
return $result;
}
2
$ar = $o->me;
reset($ar);
list($typ, $val) = myEach($ar);
3
$out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
$expected = myEach($out);
答案 2 :(得分:7)
reset($array);
while (list($key, $value) = each($array)) {
更新
reset($array);
foreach($array as $key => $value) {
答案 3 :(得分:2)
each()
的即时升级实际上有很多情况可以替换each()
,这就是为什么在这个问题中有这么多不同的答案的原因。
-while (list($key, $callback) = each($callbacks)) {
+foreach ($callbacks as $key => $callback) {
// ...
}
并且:
-while (list($key) = each($callbacks)) {
+foreach (array_keys($callbacks) as $key) {
// ...
}
并且:
-list($key, $callback) = each($callbacks);
+$key = key($opt->option);
+$val = current($opt->option);
您可以手动替换一个。但是没有更好的方法吗?
我帮助迁移超过150多个此类案例的项目。我很懒,所以我做了一个名为Rector的工具,它可以按照上面的方式转换代码(+的情况还很多,但我不想将其作为垃圾内容)。 / p>
它是php72
集的一部分。
只需安装并使用它:
composer require rector/rector --dev
vendor/bin/rector process src --level php72
我希望它可以帮助您进行迁移。
如果存在一些错误或异常,则是Rector遗漏的情况。 Create an issue,因此我们可以对其进行修复,并使其在每种情况下均适用。
答案 4 :(得分:1)
您绝对不应该这样做的方法是将函数“返回到php”,方法是将其添加到php.ini中的auto_prepend_file设置中
auto_prepend_file = "/var/www/php/auto_prepend.php"
然后制作文件并使用function_exists包装器输入函数。
<?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;
}
}
这实际上是在您的php应用程序运行之前声明了该函数。当您的应用程序尝试运行每个功能时,它将使用您的版本。
这绝对不是解决问题的方法,特别是在生产中!但是,您是一个受时间限制的开发人员,您只想为下一个项目尝试任意框架,并且没有更新它们就可以在本地开发服务器上工作,而不会减少您的php版本。
当您致力于项目的代码库后,请继续执行已接受答案中的更改,因为它们确实起作用。
我使用Wee Zel对每个函数的仿真
答案 5 :(得分:0)
对于使用Magento2或类似软件的用户,不建议更改核心文件。 也许您可以将PHP版本从7.2降级到7.1,直到magento发行新版本。
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.1
sudo apt-get install php7.1-cli php7.1-common php7.1-json php7.1-opcache php7.1-mysql php7.1-mbstring php7.1-mcrypt php7.1-zip php7.1-fpm
sudo a2dismod php7.2
sudo a2enmod php7.1
sudo service apache2 restart
并设置活动的php版本
sudo update-alternatives --set php /usr/bin/php7.1
答案 6 :(得分:0)
使用此功能怎么样?
function array_fetch(array $a) {
$element = current($a);
next($a);
return $element;
}