这个实现是PHP中Promise的公平示例吗?

时间:2013-05-16 19:54:33

标签: php promise

我一直在阅读有关Promise模式的内容,我尝试使用一些示例以及我自己对它应该如何工作的理解来在PHP中编写一个版本。我想出了Promise模式的合理示例,还是我错误地实现了这个?

class PromiseClass {
    private $callbacks = array();
    private $last_return;
    function promise($promise) {
        if (get_class($promise) == 'Promise') {
            return $promise;
        } else if (is_callable($promise)) {
            $this->then($promise);
            return $this;
        }
    }
    public function then (callable $callback) {
        $this->callbacks[] = $callback;
        return $this;
    }
    public function resolve () {
        $callback = array_shift($this->callbacks);
        if (is_callable($callback)) {
            $this->last_return = $callback($this->last_return);
        }
        if (count($this->callbacks) > 0) {
            $this->resolve();
        }
    }
}

使用示例:

$promiser->promise(function() {
        echo "sleeping\n";
        sleep(3);
        return 3;
    })
    ->then(function($args) {
        echo " in second function, $args\n";
    });
$promiser->resolve();

1 个答案:

答案 0 :(得分:17)

您的承诺实施大多是正确的。但是,存在一个问题:至少在PHP中,它几乎是无用的,几乎完全等同于观察者模式wikipedia msdn oodesign

PHP几乎完全是单线程的。 sleep也不例外。因此,您的整个Promise将阻止您的脚本,直到它完成。因此,看到操作是内联执行的,您可能也不会打扰。

摆脱这个小问题的一种可能方法是让你的Promise从主脚本分叉,这可以使用PCNTL系列函数。这将允许Promise代码在后台运行,而主脚本继续。当Promise完成时,它会回来。

http://www.php.net/manual/en/function.pcntl-fork.php#98711概述了实现此目的的方法。它主动使用pcntl_fork,它允许你分叉一个新线程。它有缺点 - 其中最大的缺点是除了信号外无法向主进程发送消息。