如何解决每个PHP已弃用的功能

时间:2017-09-29 15:52:23

标签: php

使用PHP 7.2,不推荐使用eachThe documentation说:

  

警告自PHP 7.2.0起,此功能已被弃用。非常不鼓励依赖此功能。

如何更新我的代码以避免使用它?以下是一些例子:

  1. $ar = $o->me;
    reset($ar);
    list($typ, $val) = each($ar);
    
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = each($out);
    
  3. for(reset($broken);$kv = each($broken);) {...}
    
  4. list(, $this->result) = each($this->cache_data);
    
  5. // 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++;
    }
    

7 个答案:

答案 0 :(得分:33)

对于前两个案例,您可以使用keycurrent来分配所需的值。

  1. $ar = $o->me;   // reset isn't necessary, since you just created the array
    $typ = key($ar);
    $val = current($ar);
    
  2. $out = array('me' => array(), 'mytype' => 2, '_php_class' => null);
    $expected = [key($out), current($out)];
    
  3. 在这些情况下,您可以使用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)

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) {
     // ...
 }

并且:

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