PHP是否有一种简洁的方式来创建一个“;惰性阵列”;


Does PHP have a terse way of creating a "lazy array"?

我想要一种简洁的方式来做这样的事情。

$this->requireAllConditionsAreTruthy([
    function() { return $this->clan },
    function() { return $this->team },
    function() { return $this->memberToAdd },
    function() { return $this->section },
    function() { return $this->clan->hasTeamForSection($this->section) },
    function() { return $this->memberToAdd->isInClan($this->clan) },
    function() { return ! $this->team->hasMember($this->memberToAdd) },
    function() { return ! $this->memberToAdd->isOnTeamForSection($this->section) }
]);

目的是,如果像$this->clan这样的东西被证明是假的,我希望能够抛出一个异常,记录哪个条件失败,并在调用$this->clan->hasTeamForSection之前退出数组迭代。

PHP是否有一种简洁的方法来定义一个延迟求值数组?

看起来最直接的解决方案是生成每个表达式,并将该方法视为生成器。使用yield,每个表达式只有在循环时才会延迟求值。

public function authorization() {
    yield $this->clan;
    yield $this->team;
    yield $this->memberToAdd;
    yield $this->section;
    yield $this->clan->hasTeamForSection($this->section);
    yield $this->memberToAdd->isInClan($this->clan);
    yield  ! $this->team->hasMember($this->memberToAdd);
    yield  ! $this->memberToAdd->isOnTeamForSection($this->section);
}

然后处理授权,我可以这样做:

public function authorize() {
    foreach ($this->authorization() as $key => $condition) {
        if (!$condition) {
           Log::debug(sprintf("Authorization condition %s failed in %s", $key, get_class($this));
           throw new AuthorizationException;
        }
     }
 }

这将使授权验证保持在最低限度,同时仍然提供关于哪个条件失败的更精确的反馈,用于调试或一般日志记录目的。