嗨我有这段代码$node->field['un']
,但这句话重复了很多次,我想这样做:
$varstring="value";
node->$varstring['un'];
但我无法做到,我无法替换field
我的var $varstring
我想用field
替换$varstring
。
你能帮帮我吗?
答案 0 :(得分:4)
如果你正在使用PHP 7,那么$node->$varstring['un']
将按预期工作。在PHP 7之前,您需要使用大括号强制执行评估顺序,如此$node->{$varstring}['un']
,否则,在PHP 5中,它被读作$node->{$varstring['un']}
,假定$varstring
是一个数组,并尝试在该数组中找到一个名为'un'
的键,将结果值传回$node
。
以下是PHP 5和PHP 7之间的示例和差异。
$node = new stdClass;
$node->a = ["un" => "a.un"];
$node->b = ["un" => "b.un"];
$node->c = ["un" => "c.un"];
$varstring = "a";
var_dump($node->$varstring['un']);
在PHP 5中你得到了
PHP Warning: Illegal string offset 'un' in /tmp/test.php code on line 9 Warning: Illegal string offset 'un' in /tmp/test.php code on line 9 array(1) { ["un"]=> string(4) "a.un" }
$node = new stdClass;
$node->a = ["un" => "a.un"];
$node->b = ["un" => "b.un"];
$node->c = ["un" => "c.un"];
$varstring = "a";
var_dump($node->{$varstring}['un']);
在PHP 5或7中,你得到
string(4) "a.un"
$node = new stdClass;
$node->a = ["un" => "a.un"];
$node->b = ["un" => "b.un"];
$node->c = ["un" => "c.un"];
$varstring = "a";
var_dump($node->$varstring['un']);
在PHP 7中,你得到了
string(4) "a.un"
如果您使用大括号,它仍然向后兼容PHP 5,并且仍然在PHP 7中继续工作(向前兼容)。所以你应该肯定为PHP 7准备任何现有代码,因为PHP 5将在不久之后出现在门外(可能在一两年内)
语法称为Uniform Variable Syntax,以防您想要阅读更多内容。简单地说,最简单的方法就是在PHP 7中每个变量表达式从左到右读取 而在PHP 5中你有一些不一致的地方,比如你的这里的示例(某些部分从左到右,其他部分从右到左)。