我正在使用模板引擎在我想要的网站中插入代码。
我写了一个函数来测试一些非常简单的东西:
myfunction() { return '($this->data["a"]["b"] ? true : false)'; }
问题是,$ this->数据是私有的,我无法在任何地方访问它,所以我必须使用getData();这导致我的问题。
$this->getData()['a']['b']
不起作用,并且首先分配值也不会因为它将直接在if()块中使用。
有什么想法吗?
答案 0 :(得分:132)
从PHP 5.4开始,就可以做到这一点:
getSomeArray()[2]
参考:https://secure.php.net/manual/en/language.types.array.php#example-62
在PHP 5.3或更早版本中,您需要使用临时变量。
答案 1 :(得分:16)
你不能使用这样的东西:
$this->getData()['a']['b']
即,在函数调用中不能直接使用数组访问语法。
你必须使用一些临时变量,如下所示:
$tmp = $this->getData();
$tmp['a']['b'] // use $tmp, now
在你的情况下,这可能意味着使用这样的东西:
function myfunction() {
$tmp = $this->getData();
return ($tmp['a']['b'] ? true : false);
}
你必须:
getData()
方法,并将其返回值存储在临时varibale中你没有太多选择,实际上......
答案 2 :(得分:12)
好的......显然确实没有更好的方法,所以我会用一个不那么漂亮的解决方案回答自己:
我创建了这个函数:
arrayGet($array, $index) { return $array[$index]; }
并像这样使用它:
myfunction() { return '(arrayGet(arrayGet($this, "a"), "b") ? true : false)' }
这不太好但有效。
答案 3 :(得分:1)
$this
->data
始终可访问,如果受到保护。无法从任何地方访问 $object
->data
,因此,如果您在代码中返回$this
,并且对其进行评估,则应该没问题。
顺便说一句,你的代码中有一个错误:引号需要转义。
myfunction() { return '($this->data[\'a\'][\'b\'] ? true : false)'; }
答案 4 :(得分:1)
可以从PHP 5.4版开始。
如果您不希望的临时变量而您的PHP版本低于5.4 ,那么您仍然可以使用一些内置函数来获取第一个或最后一个元素:
$x = 'first?last';
$first = array_shift(explode('?', $x));
$last = end(explode('?', $x));
$last2 = array_pop(explode('?', $x));
修改强> !请注意,在更高版本(5.4+)中,PHP将发出通知,因为end只需要将变量作为参数。