所以我重新写了这篇文章,希望能更清楚地知道我在尝试什么。在一些数据解析期间,接收与someCode相关联的someValue。目的是捕获具有最低优先级的someCode的特定值,而不管someCode / someValue接收的顺序如何。保持这种工作的问题是每次调用私有函数时都会创建闭包,因此$ precedenceOfCodeCaptured的值总是重置为null。如果我能保持封闭,那么事情可能会按预期发挥作用。
private function Foo($particularValue, $someValue, $someCode) {
switch ($someCode) {
case:
CODE1:
case:
CODE2:
$c = function () use ($someCode, $someValue) {
static $precedenceOfCodeCaptured = null;
$precedenceArray = array(
CODE2 => 1,
CODE1 => 2
);
if ((is_null($someValue))) {//first time the case statement matched because $someValue==null
$precedenceOfCodeCaptured = $precedenceArray[$someCode];
$particularValue = someValue;
} else if ($precedenceArray[$someCode] <= $precedenceOfCodeCaptured) {
$particularValue = someValue;
}
};
$c();
break;
...
}
}//end of private method
答案 0 :(得分:0)
每次调用Foo时,都会创建一个新的函数/闭包,因为你评估了一个函数(),这就是评估函数()的作用!
如果你想让Foo()每次返回相同的函数/闭包,只需要评估一次。也许使用单例模式,您将检查是否已初始化保存该函数的某个更高范围的变量,如果没有则初始化它。
例如:
$c = null;
private function Foo(){
if ($c == null) {
$c = function() use ( $whatever){
static $x = 0;
echo "x= $x";
$x++;
...
};
}
$ C(); } //私有方法的结束
(但请不要在实际代码中使用全局变量!)
答案 1 :(得分:0)
试试这个:
static $x = 0;
private function Foo() {
$c = function() use ( $whatever){
echo "x= $x";
self::$x++;
...
};
$c();
}
答案 2 :(得分:0)
<?php
class example{
private function foo(){
static $_closure;
if( ! $_closure ){
$_closure = function(){
static $_state;
/* . . . */
};
}
$_closure();
}
}
请注意,闭包是静态的(它是在第一次使用时创建的,而不是再次创建),就像在闭包内保存状态的变量一样。
然而,正如其他答案所述,这是毫无意义的&#34;最好。 $_closure
应该是另一种类方法; $_state
应该是一个类属性(在foo()
中,在类中也不需要静态任何东西)。它不是更清洁&#34;或者更具可读性或性能(事实上,相反的情况可能是正确的)来使用这样的闭包。
如果你做的事情可能有意义:
......但就目前而言,这只是错误的做法。这样做的工具已经存在。