我有这段代码:
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']}();
答案 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']}();
编辑:将花括号移动到正确的位置。