你好,我有这个代码$node->field['un']
但这句话重复了很多次,我想这样做:
$varstring="value";
node->$varstring['un'];
但是我不能这样做,我怎么能代替field
为我的var $varstring
我想用$varstring
代替field
。
如果您使用PHP 7,那么$node->$varstring['un']
将像您期望的那样工作。在php7之前,你需要使用大括号来强制像$node->{$varstring}['un']
这样的求值顺序,否则,在php5中,它被读为$node->{$varstring['un']}
,它假设$varstring
是一个数组,并试图在该数组中找到一个名为'un'
的键,并将结果值返回给$node
。
下面是一个PHP 5和PHP 7的区别的例子。
PHP 5$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警告:第9行/tmp/test.php代码中的非法字符串偏移'un'警告:第9行/tmp/test.php代码中的非法字符串偏移'un'数组(1){["联合国"]=>字符串(4)"a.un"}之前在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或7中得到
<>之前字符串(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中得到
<>之前字符串(4)"a.un"之前准备PHP 7
如果您使用大括号,它仍然与PHP 5向后兼容,并且在PHP 7中仍然继续工作(向前兼容)。所以你应该为PHP 7准备好现有的代码,因为PHP 5很快就要发布了(可能在一两年)。
这种语法被称为统一变量语法,如果你想进一步了解它的话。简单地说,记住这一点的最简单方法是,在PHP 7中每个变量表达式都是从左到右读取,而在PHP 5中,您有一些不一致的地方,就像这里的例子(部分从左到右其他部分从右到左)。