5

这里有一个小模型来描述我的困境:

<?php
$var = "Before";

function getVar(){
    global $var;

    return $var;
}

$array = Array(
    "variable" => "Var = " . getVar()
);

$var = "After";

echo $array['variable'];
?>

该代码会回显“之前”,我的目标是回显“之后”。我意识到这就是 PHP应该如何工作的,但是只有在调用数组时才执行数组至关重要getVar()

我该怎么做呢?

4

3 回答 3

2

你不能这样做,因为数组声明会初始化它——所以你在数组的“用法”和它的定义处混合调用函数。没有“用法”:数组已经定义到那个时刻。

但是,答案可能是使用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'

- 即在实际发生时尝试调用元素内部的数据。您可能希望有不同的构造函数(用于关联数组) - 但显示了总体思路。

于 2013-10-16T07:47:25.103 回答
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

在此处输入图像描述

于 2014-05-04T12:04:49.170 回答
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:很抱歉回答晚了,但萨尔茨堡停电了。:(

于 2013-10-16T07:34:51.973 回答