【发布时间】:2017-02-13 23:26:47
【问题描述】:
我不确定如何最好地命名这个,所以我想我会发布一个我正在努力实现的示例。我现在已经超级简化了。
首先是执行该操作的非常基本的类。
abstract class AuditedSave extends AuditedSaveImplementation
{
public static function run($callback = null)
{
return new AuditedSaveImplementation($callback);
}
}
class AuditedSaveImplementation
{
public function __construct(Closure $closure)
{
echo ' - I ran before'; // point 1, $test = 0
$closure();
echo ' - i ran after!'; // point 2, $test = 1
}
}
然后是调用它的代码。
$test = 0;
AuditedSave::run(function() use ($test)
{
$test = 1;
});
所以在注释的第 1 点和第 2 点之间,闭包运行并将 $test 的值设置为 1。但是,我想存储作为第一个参数传递的任何值(在本例中为 $test ) 作为函数调用时的副本 - 它将始终运行,然后闭包对其进行修改(这是可以可变的部分),然后进行比较并根据差异进行操作 -它将始终运行。
但是,为了做到这一点,我需要能够访问 AuditedSaveImplementation 的 __construct() 方法中的 $test 变量,而无需知道它的名称。
这可能吗?
【问题讨论】:
-
不,
$test的范围与AuditedSaveImplementation::__construct完全不同。你必须重新考虑你想在这里做什么。 -
不可能。传入另一个具有适当逻辑的类(例如
getValue()和/或getOriginalValue()),而不是简单的闭包。此外,$test总是被复制到您指定的代码中(好吧,它实际上是写时复制,但这不是很相关)。更改它不会影响原始变量。
标签: php closures anonymous-function