# 流程控制

Testing Is Documentation

tests/Flow/FlowControlTest.php

QueryPHP 为流程控制类统一抽象了一个基础流程控制类 \Leevel\Flow\FlowControl,流程控制类可以轻松接入。

系统一些关键服务,比如说数据库查询条件、HTTP 响应等流程控制类均接入了统一的抽象层。

Uses

<?php

use Leevel\Flow\FlowControl;

# 基础使用方法

fixture 定义

Tests\Flow\Test1

namespace Tests\Flow;

class Test1
{
    use FlowControl;

    protected $value = [];

    public function __call(string $method, array $args)
    {
    }

    public function value()
    {
        return implode(' ', $this->value);
    }

    public function condition1()
    {
        if ($this->checkFlowControl()) {
            return $this;
        }

        $this->value[] = 'condition1';

        return $this;
    }

    public function condition2()
    {
        if ($this->checkFlowControl()) {
            return $this;
        }

        $this->value[] = 'condition2';

        return $this;
    }

    public function condition3()
    {
        if ($this->checkFlowControl()) {
            return $this;
        }

        $this->value[] = 'condition3';

        return $this;
    }

    public function condition4()
    {
        if ($this->checkFlowControl()) {
            return $this;
        }

        $this->value[] = 'condition4';

        return $this;
    }

    public function condition5()
    {
        if ($this->checkFlowControl()) {
            return $this;
        }

        $this->value[] = 'condition5';

        return $this;
    }
}
public function testBaseUse(): void
{
    $test = new Test1();

    $this->assertSame('', $test->value());

    $condition1 = 1;

    $value = $test
        ->if($condition1)
        ->condition1()
        ->else()
        ->condition2()
        ->fi()
        ->value();

    $this->assertSame('condition1', $value);
}

# else 条件语句

public function testElse(): void
{
    $test = new Test1();

    $condition1 = 0;

    $value = $test
        ->if($condition1)
        ->condition1()
        ->else()
        ->condition2()
        ->fi()
        ->value();

    $this->assertSame('condition2', $value);
}

# else 条件语句例子

测试例子

# Tests\Flow\FlowControlTest::getElseData
public function getElseData()
{
    return [
        [0, 'condition1 condition5'],
        [1, 'condition2 condition5'],
        [2, 'condition3 condition5'],
        [3, 'condition4'], // else 仅能根据上一次的 elif 或 if 来做判断,这里为 elif(3 === $condition)
        [4, 'condition5'],
        [5, 'condition5'],
        [6, 'condition5'],
    ];
}
public function testElseMulti(int $condition, string $result): void
{
    $test = new Test1();

    $value = $test
        ->if(0 === $condition)
        ->condition1()
        ->elif(1 === $condition)
        ->condition2()
        ->elif(2 === $condition)
        ->condition3()
        ->elif(3 === $condition)
        ->condition4()
        ->else() // else 仅能根据上一次的 elif 或 if 来做判断,这里为 elif(3 === $condition)
        ->condition5()
        ->fi()
        ->value();

    $this->assertSame($result, $value);
}

# elif 条件语句

public function testElseIfs(): void
{
    $test = new Test1();

    $condition1 = 1;

    $value = $test
        ->if(0 === $condition1)
        ->condition1()
        ->elif(1 === $condition1)
        ->condition2()
        ->fi()
        ->value();

    $this->assertSame('condition2', $value);
}