【问题标题】:How to write that in PHP 7.2?如何在 PHP 7.2 中编写它?
【发布时间】:2018-10-22 08:56:57
【问题描述】:

我有这段代码:

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']}(); 

【问题讨论】:

  • 应该在 php 7.2 中工作 - 它在 5.X 中对我来说会出错?
  • 嗯,该站点在 PHP 7.2 上运行,兼容性扫描仪给了我一个错误。嗯……
  • 你有没有 var_dumped $this、$this->value 和 $this->value['custom']?
  • 它在 Ajax 请求中,所以我不能 var_dump,可以吗?
  • 修复评估的顺序,因为似乎$value(数组)首先被字符串化:$this->{$value['custom']}() 左右应该可以工作,如果语法错误,您可能需要一个中间变量$x = $value['custom']; $this->$x()

标签: php php-7.2


【解决方案1】:

评估变量是一个顺序问题。

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

然后

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

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

因此有 3 个错误:

数组到字符串的转换

未定义的属性 x::$Array

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

相反,用花括号来设置解析顺序:

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

会工作。所以使用$this->{$value['custom']}()

【讨论】:

    【解决方案2】:

    这将在 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 中执行得很好。

    然后我把sn-p改成这个,不调用直接将数组键转换为函数名的方法,而是先用函数名初始化一个字符串(希望你的代码中没有类型验证)变量:

    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 中运行良好

    【讨论】:

      【解决方案3】:

      您可以尝试使用复杂(卷曲)语法重写您的代码,您可以阅读更多关于它的信息here

      您的代码看起来像这样。

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

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

      【讨论】:

      • 这个想法在这里(“使用大括号语法”),但这是一个无效的用法。
      猜你喜欢
      • 1970-01-01
      • 2023-03-31
      • 2020-08-19
      • 2016-08-03
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2022-11-24
      • 2021-09-26
      相关资源
      最近更新 更多