如何在PHP 7.2中编写代码?

时间:2018-10-22 08:56:58

标签: php php-7.2

我有这段代码:

private function _resolveCustomEntries($fields)
{
    foreach ($fields as &$value) {
        if (array_key_exists('custom', $value)) {
            if (method_exists($this, $value['custom'])) {
                $value['custom'] = $this->$value['custom'](); //variableInterpolation
            }
        }
    }
    return $fields;
}

我运行了PHP 7.2兼容性检查,并在此处抱怨带有标明行的“ variableInterpolation”。当我运行此代码时,PHP日志会告诉我这一点:

  

ERR(3):注意:数组到字符串的转换   /public_html/lib/KiTT/Payment/Widget.php,第217行

在同一行中“ variableInterpolation”检查失败。那么我将如何重写此代码,使其在PHP 7.2中起作用?

谢谢!

解决方案:

$value['custom'] = $this->$value['custom']();

必须看起来像这样:

$value['custom'] = $this->{$value['custom']}(); 

3 个答案:

答案 0 :(得分:3)

这是顺序变量被逃避的问题。

使用

class x {
  public function y() {
    echo 'ok';
  }
}
$x = new x();
$y = array('i' => 'y');

然后

$x->$y['i']();

失败,因为PHP首先尝试将$y变量转换为字符串,并获取$x的匹配属性(顺便说一句不存在),然后尝试获取索引{{1} }或该不存在的属性,然后尝试将其作为可调用对象运行。

因此出现3个错误:

  

数组到字符串的转换

     

未定义的属性x :: $ Array

     

函数名称必须是字符串(nda:未定义的属性返回NULL)

使用大括号将变量设置为解析顺序:

'i'

会工作。因此请使用$x->$y['i']();

答案 1 :(得分:1)

这将在7.2中将数组转换为字符串转换

class bob{


    function foo(){
        return 'bar';
    }

    function getFoo(){

        $value['custom'] = 'foo';

        $value['custom'] = $this->$value['custom']();

        return $value['custom'];
    }


}

$bob = new Bob();

var_dump($bob->getFoo());

但是它将在5.6中执行得很好。

然后我将代码段更改为此,而不是调用直接将数组键转换为函数名称的方法,而是首先使用函数名称初始化字符串(希望代码中没有类型验证):

class bob{


    function foo(){
        return 'bar';
    }

    function getFoo(){

        $value['custom'] = 'foo';

        $functionName = $value['custom'];

        $value['custom'] = $this->$functionName();

        return $value['custom'];
    }


}

$bob = new Bob();

var_dump($bob->getFoo());

这将在php 7.2中正常运行

答案 2 :(得分:-1)

您可以尝试使用复杂的(卷曲)语法重写代码,可以进一步了解here

您的代码看起来像这样。

$value['custom'] = $this->{$value['custom']}();

编辑:将花括号移动到正确的位置。