这是一个描述我的困境的小模型:
<?php
$var = "Before";
function getVar(){
global $var;
return $var;
}
$array = Array(
"variable" => "Var = " . getVar()
);
$var = "After";
echo $array['variable'];
?>
该代码将回应'之前',我的目标是回应'之后'。我意识到这就是PHP 假设的工作原理,但是只有在调用它时,才能执行getVar()
数组。
我将如何做到这一点?
答案 0 :(得分:2)
你不能这样做,因为数组声明将初始化它 - 所以你要混合函数调用数组的'usage'和它的定义。没有“使用”:数组已定义到那一刻。
然而,答案可能是使用ArrayAccess,如下所示:
class XArray implements ArrayAccess
{
private $storage = [];
public function __construct()
{
$this->storage = func_get_args();
}
public function offsetSet($offset, $value)
{
if(is_null($offset))
{
$this->storage[] = $value;
}
else
{
$this->storage[$offset] = $value;
}
}
public function offsetExists($offset)
{
return isset($this->storage[$offset]);
}
public function offsetUnset($offset)
{
unset($this->storage[$offset]);
}
public function offsetGet($offset)
{
if(!isset($this->storage[$offset]))
{
return null;
}
return is_callable($this->storage[$offset])?
call_user_func($this->storage[$offset]):
$this->storage[$offset];
}
}
function getVar()
{
global $var;
return $var;
}
$var = 'Before Init';
$array = new XArray('foo', 'getVar', 'bar');
$var = 'After Init';
var_dump($array[1]);//'After Init'
-i.e。当实际发生时,尝试调用元素内部的数据。您可能希望使用不同的构造函数(对于关联数组) - 但是显示了一般的想法。
答案 1 :(得分:0)
在编辑问题后编辑我的答案。
不,你想要实现的是不可能的,因为当你调用它返回的函数时,它就完成了。但是你可以通过面向对象的编码实现类似的功能。我会为你创造一些东西,请稍等。
<?php
class Foo {
public function __toString() {
global $var;
return "Var = {$var}";
}
}
$var = "Before";
$array = array( "variable" => new Foo() );
$var = "After";
echo $array['variable'];
?>
PS:对于迟到的答案很抱歉,但萨尔茨堡有停电事件。 :(
答案 2 :(得分:0)
我突然想到你也可以使用匿名函数并调用/执行那些
概念证明:
$var = "Before";
function getVar(){
global $var;
return $var;
}
$array = Array(
"variable" => create_function(null, "return 'Var = ' . getVar();")
);
$var = "After";
echo $array['variable']();
返回
Var = After