【发布时间】:2014-12-24 15:49:04
【问题描述】:
我正在寻找与上下文无关的延迟闭包评估。在伪代码中:
// imagine there's a special type of "deferred" variables
$var = (deferred) function () {
// do something very expensive to calculate
return 42;
};
// do something else - we do not need to know $var value here,
// or may not need to know it at all
var_dump($var * 2);
// after some million years it prints: int(84)
// now this is the hardest part...
var_dump($var); // notice no brackets here
// prints immediately as we already know it: int(42)
最后一步至关重要:这样我们可以传递一个变量(或一个类成员),而无需任何人知道它实际上是什么,直到他们使用它。
显然,我不能在语言中完全做到这一点,因为即使使用字符串 __toString() 魔术方法也不会替换原始值。甚至它也不能与字符串以外的任何东西一起使用:
// this will fail
function __toString()
{
return new Something();
}
当然,我可以用另一个对象包裹闭包,但这意味着堆栈中的每个人都必须知道如何处理它。而这正是我想要避免的。
这甚至是遥不可及的吗?也许在某个地方有一个 hacky PECL 可以执行此操作或类似的操作。
【问题讨论】:
-
嗨@sanmai,你有没有找到任何方法来做到这一点?我想做同样的事情,并且无法找到一种方法,而不必“调用”函数/对象/闭包来获取值。
标签: php closures lazy-evaluation