【问题标题】:Creating OOP Callbacks创建 OOP 回调
【发布时间】:2016-06-24 11:50:00
【问题描述】:

我正在尝试了解如何将匿名函数与 OOP 回调方法一起使用。我的班级是这样的:

class Example
{
    protected $Callbacks = array();

    public function set(
        $foo,$bar
    ) {
        $this->Callbacks[$foo] = $bar;
    }

    public function get(
        $foo
    ) {
        return $this->Callbacks[$foo];
    }
}

要添加新的回调,我只需执行以下操作:

$example = new Example;
$example->set(
     'example', function() {
         return 'hello';
     });

但是,当我想使用该功能时,运行它时没有任何反应:

echo $example->get('example');

谁能帮助并解释如何以 OOP 方式创建回调?

【问题讨论】:

  • 这只是检索闭包,但不执行任何操作
  • 哦,对了,我怎样才能让它执行函数并回显返回? @PeeHaa
  • 你通常如何执行一个函数?
  • 所以它会像 echo $example->get('example')(); ? @PeeHaa
  • 我找不到这么快的骗子,但你可以自己回答。

标签: php oop callback anonymous-function


【解决方案1】:

你可以这样调用你的函数:

echo $example->get('example')();

但我认为它很难看。您也可以为此使用魔术方法。但这也不是最佳做法。

class Example
{
    protected $Callbacks = array();

    public function __set($name, $value)
    {
        $this->Callbacks[$name] = $value;
    }

    public function __call($name, array $arguments)
    {
        if (!isset($this->Callbacks[$name])) {
            trigger_error('Call to undefined method ' . get_class($this) . "::$name()", E_USER_ERROR);
        }
        return $this->Callbacks[$name]($arguments);
    }
}

$example = new Example();
$example->example = function() {
    return 'hello';
};

echo $example->example();

【讨论】:

  • 但这也不是最佳实践。手册是否说明了在最佳实践方面如何使用它们?我在这里没有看到任何不好的做法。它达到了它的目的,并且在执行存储在对象中的匿名函数时,魔术方法显然具有优势。它成为不好的做法的部分是其他开发人员实际上不理解它。方法example 可以解释为类Example 的真实方法,如果类Examples 源变得更大,则可能更难调试。这就是文档的作用。
  • 我将它用于我的 DI 容器类,因此我可以轻松设置新函数而无需编辑类,我对其进行了编辑,因此 get() 函数返回函数的执行版本和它将$this 传递给函数,因此我可以使用对象范围。但是,这个答案让我对闭包和魔术方法有了一个理解!
  • @KyleThomas nice ;) 如果您理解,请记录下来,以便其他人也能理解 :)
  • 这是真的!你的脑袋被代码弄得乱七八糟,所以你不能说出你的想法哈哈!再加上我都是自学成才的,所以希望我能尽快开始写博客:D 感谢大家的帮助 @dbf
【解决方案2】:

也感谢@PeeHaa,我终于解决了这个问题。

当我检索函数时,它仍处于关闭状态,尚未执行。根据您的 PHP 版本,您可以执行以下任一操作:

$execute = $example->get('example')();
echo $execute;

echo $example->get('example')();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-15
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多