【问题标题】:Convert static method to lambda in PHP在 PHP 中将静态方法转换为 lambda
【发布时间】:2013-05-30 14:41:27
【问题描述】:

我想从类中获取静态方法并将其复制到变量中。

这是说明我的问题的无效示例:

class foo
{
    public static function bar($argument){ return 2*$argument; }
}

$class = new ReflectionClass('foo');
// here is no ReflectionMethod::getClosure() method in reality
$lambda = $class->getMethod('bar')->getClosure();

echo $lambda(3);

所以我的问题是:这可以通过任何正常方式实现吗?我现在只找到一种方法。我可以解析源文件,从中获取方法源并使用 create_function() 进行转换,但这太不正常了。

【问题讨论】:

  • 我不确定你是否可以使用反射:我认为你需要使用 PHP 标记器
  • 我不明白这样做的目的,但是创建 lambda 函数作为 foo::bar() 的包装器呢?
  • 想了想,我敢说应该不可能把一个类方法转换成一个lambda函数。这是没有意义的,如果有可能(或者,我们在这里谈论 php 及其所有问题......),那么事情可能真的会破裂。原因是类方法可能不是独立的:它可能引用其他方法或类的成员。如果没有这些存在,lamba 函数肯定毫无意义......
  • 感谢您的回答,但您是对的,arkascha:我试图独立于类定义。因此,在闭包内包装静态调用是我的问题的答案,但不是我的问题的解决方案。
  • @crimaniak,你有什么问题?

标签: php reflection lambda


【解决方案1】:

用闭包把它包起来。

$lamda = function($argument){return foo::bar($argument);};

或者你可以尝试使用类似的东西

function staticMethodToClosure($class, $method) {
    return function($argument)use($class, $method){return $class::$method($argument);};
}

【讨论】:

  • 查看我之前的评论...但是我猜 OP 希望独立于类定义。
  • @arkascha,那里有新功能。
  • 这意味着什么?您仍然需要类定义。除了您允许指定类和方法名称外,没有任何变化。大不了。
【解决方案2】:

array($className, $methodName) 格式的数组可作为静态方法调用进行调用,因此这可能对您有用。

class foo
{
    public static function bar($argument){ return 2*$argument; }
    public static function getStaticFunction($arg){
        return array("foo", $arg);
    } 
}

$a = foo::getStaticFunction("bar");
echo $a(5);  // echos 10

【讨论】:

    猜你喜欢
    • 2020-10-03
    • 2013-03-12
    • 2011-11-17
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多