只有在请求时才初始化数组中的变量

时间:2013-10-16 07:29:09

标签: php arrays lazy-loading

这是一个描述我的困境的小模型:

<?php
$var = "Before";

function getVar(){
    global $var;

    return $var;
}

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

$var = "After";

echo $array['variable'];
?>

该代码将回应'之前',我的目标是回应'之后'。我意识到这就是PHP 假设的工作原理,但是只有在调用它时,才能执行getVar()数组。

我将如何做到这一点?

3 个答案:

答案 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

enter image description here