6

我想将一个静态函数分配给一个变量,以便我可以将它作为参数发送。例如:

class Foo{
    private static function privateStaticFunction($arg1,$arg2){
      //compute stuff on the args          
    }

    public static function publicStaticFunction($foo,$bar){

         //works
         $var = function(){
                   //do stuff
                };

         //also works
         $var = function($someArg,$someArg2){
                   //do stuff
         };

         //Fatal error: Undefined class constant 'privateStaticFunction'                    
         $var = self::privateStaticMethod;

         //same error
         $var = Foo::privateStaticFunction;

         //compiles, but errors when I try to run $var() somewhere else, as expected
         //Fatal error: Call to private method Foo::privateStaticMethod() from context ''
         $var = function(){
             return Foo::privateStaticMethod(); 
         }; 
    }
}

我尝试了更多变体,但没有一个奏效。

我什至不希望这种功能性黑客可以与 PHP 一起使用,但是嘿,谁知道呢?

是否有可能在 PHP 中做到这一点,或者我需要想出一些技巧eval吗?

PS:##php上的 LawnGnome提到了一些关于可以做我想做的事情的事情,array('Foo','privateStaticMethod')但我不明白他的意思,因为他看起来很忙,所以我没有进一步催促他。

4

3 回答 3

4

您想将call_user_func与数组参数一起使用。

$var = array('Foo','privateStaticMethod');
call_user_func($var);

请注意,该方法上的“私有”说明符将使其只能在Foo类中以这种方式调用。

call_user_func 将可调用对象作为第一个参数。请注意,从 PHP 5.2.3 开始,您可以避免使用数组表示法。

静态类方法也可以在不实例化该类对象的情况下传递,方法是传递类名而不是索引 0 处的对象。从 PHP 5.2.3 开始,也可以传递 'ClassName::methodName'。

于 2012-09-26T03:35:45.587 回答
3

请注意,您应该将静态变量设置为:

static $privateStaticMethod;

$var = self::$privateStaticMethod;

$在使用时省略aself::将尝试访问类 CONSTANT 而不是变量。

实际上,我认为您的意思是:

//Fatal error: Undefined class constant 'privateStaticFunction'                    
$var = self::privateStaticFunction("arga", "argb");

如果你使用的是 PHP 5.4,你可以在你的publicStaticFunction:

$var = function(){
    return self::privateStaticFunction(); 
}; 

$var();

在 PHP 5.4 中,PHP 允许您class scope从 lambda 函数访问。

另外,你调查过ReflectionClass吗?

以下将用于以call_user_func_array()更 OOP 样式替换:

<?php
$rc = new ReflectionClass('SomeClass');
$class = $rc->newInstanceArgs(array('foo', 'bar'));

echo $class->doSomething();

您可以编写自己的类以使用ReflectionMethod哪些实现ReflectionClass和使用setAccessible()来允许访问受保护和私有方法。

于 2012-09-26T03:47:50.287 回答
1

这是我为解决问题所做的

class test{
  static function Unix($arr){return implode("/",$arr);}
  static function Windows($arr){return implode("\\",$arr);}
  function test(){
    $slash = "Unix";
    echo self::$slash(["path","to","a","folder"]);
  }
}
于 2015-05-10T00:44:27.777 回答