私有类方法中定义的php闭包中的静态变量

时间:2014-09-16 01:01:40

标签: php static closures

所以我重新写了这篇文章,希望能更清楚地知道我在尝试什么。在一些数据解析期间,接收与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

3 个答案:

答案 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;或者更具可读性或性能(事实上,相反的情况可能是正确的)来使用这样的闭包。

如果你做的事情可能有意义:

  • 将封闭物归还其他地方
  • 在运行时动态创建函数(即,基于foo()args)
  • 其他动态而有趣的东西

......但就目前而言,这只是错误的做法。这样做的工具已经存在。