php - 匿名函数/闭包和使用 self::or static::

标签 php static closures anonymous-function

我正在使用匿名函数,我在对象外部创建匿名函数,然后将其添加到稍后将与 __callStatic 魔术函数一起使用的对象。添加的闭包包含来自父类的方法。我想知道我是否能够从闭包中调用这些方法?

现在我收到这个错误:

EmptyObject::addMethod('open', function(){
    if (static::_hasAdapter(get_class(), __FUNCTION__))
            return self::_callAdapter(get_class(), __FUNCTION__, $details);

    echo '<p>You have mail!</p>';
});

抛出这个错误:

Fatal error: Cannot access static:: when no class scope is active in

//Add the functions
EmptyObject::addMethod('open', function(){
    if (EmptyObject::_hasAdapter('EmptyObject', __FUNCTION__))
            return EmptyObject::_callAdapter('EmptyObject', __FUNCTION__, $details);

    echo '<p>You have mail!</p>';
});

抛出这个错误是因为方法被保护了

Fatal error: Uncaught exception 'BadMethodCallException' with message 'Method '_hasAdapter' was not found in class EmptyObject'

最佳答案

您可以使用 Closure::bind() 来实现此目的(PHP >= 5.4.0)

abstract class EmptyObject
{
   protected static $methods = array();

   final public static function __callStatic($name, $arguments)
   {
      return call_user_func(self::$methods[$name], $arguments);
   }

   final public static function addMethod($name, $fn)
   {
      self::$methods[$name] = Closure::bind($fn, NULL, __CLASS__);
   }

   final protected static function protectedMethod()
   {
      echo __METHOD__ . " was called" . PHP_EOL;
   }
}

现在任何传递给 EmptyObject::addMethod() 的匿名函数都将在 EmptyObject 类的范围内运行

EmptyObject::addMethod("test", function()
{
   self::protectedMethod();
});


// will output:
// EmptyObject::protectedMethod was called

EmptyObject::test();

关于php - 匿名函数/闭包和使用 self::or static::,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287390/

相关文章:

php - 使用 Javascript 将值插入多个隐藏字段,每个字段都以不同的形式

c++ - 你怎么知道 main 是否已经退出?

c++ - 静态变量没有增加

c++ - 回推到静态 vector 中的 vector

javascript - 与闭包的混淆以及为什么返回不正确的值

javascript - 如何使用 PHP 获取被 javascript 隐藏的 URL 的内容

javascript - 通过 JavaScript 调用带有 php 变量的 php 脚本

javascript - Firefox Javascript 事件匿名函数

php - 如何从大量数据创建数组?

swift - future 在 Swift 3 中的实现