omitobisam/conditional

面向对象风格的if-else语句的流畅助手

2.0.0 2024-04-30 21:10 UTC

This package is auto-updated.

Last update: 2024-09-30 22:00:28 UTC


README

Build Status Latest Stable Version Total Downloads Latest Unstable Version Latest Monthly Downloads License

关于Conditional

以更简洁、更美观的方式处理if-else语句。

conditional(isset($data))
    ->then(fn() => doThis())
    ->else(fn() => doThat());

安装

composer require omitobisam/conditional

最低要求

  • PHP >=7.4

使用方法

您可以简单地静态调用它

use Conditional\Conditional;
$data = null;

Conditional::if(is_null($data))
    ->then(fn() => doThis())
    ->else(fn() => doThat());

Conditional还提供了一个名为conditional()的辅助函数,其用法如下

conditional(isset($data))
    ->then(fn() => doThis())
    ->else(fn() => doThat());

🎉 现在就像三元运算符一样。Conditional在1.2版本中,else()立即返回最后一个真值执行的值

conditional('1' === 'a', 1, 2); //returns 2 - without calling ->value()

conditional(false, 1)

  ->else(2); //returns 2 - without calling ->value()

// Of course the normal one
conditional(false)

  ->then(1)

  ->else(2); //returns 2

您还可以在if方法上评估闭包调用

use Conditional\Conditional;

Conditional::if(fn() =>  '1' == 1) // or conditional(fn() => 1 + 1)
    ->then(fn() => doThis()) // doThis() is executed
    ->else(fn() => doThat());

Conditional还允许返回传递给条件的值。您使用value()方法获取值,无论是闭包传递的结果还是原始值。

use Conditional\Conditional;

$value = Conditional::if(fn() => 'a' !== 1) // or conditional(fn() => 'a' !== 1)
    ->then(1)
    ->value(); // returns 2 (because a !== 1)

//do something with $value

最后,then()else()方法接受可调用的类或对象。让我们看看

use Conditional\Conditional;

class Invokable {

    public function __invoke()
    {
        return 'I was Invoked';
    }
}

$invokableClass = new Invokable();

$value = Conditional::if(fn() => 'a' === 1) // or conditional(fn() => 1 + 1)
    ->then(1)
    ->else($invokableClass); //Value returns 'I was Invoked'

// Do something with $value

您还可以根据条件抛出异常,如下所示

 \conditional('foo' === 'bar')

    ->then('foo === bar')

    ->else(new TestException('Foo is not the same as bar'));  //this exception is thrown

新发布

Conditional的elseIf()方法如下

conditional(isset($data))

    ->then(fn() => doThis())

    ->elseIf(is_int(1))

    ->then(fn() => doThat())

    ->else(2);

elseIf()可以在实例上多次调用

$value = Conditional::if(false)

    ->then('a')

    ->elseIf('b' == 1) //first one

    ->then('b')

    ->elseIf('b' !== 2) //another

    ->then('2')

    ->else(1);

// $value is '2'

即将推出

If()elseIf()语句在未满足条件且未调用else()时接受默认值,如下所示

Conditional::if(is_array('a'), 'ninja') //default value is ninja

    ->then(fn() => doThis())

    ->elseIf(is_int(""))

    ->then(fn() => doThat())
    
    ->value(); // 'ninja' is returned :scream:

多重条件检查,如a && b && c && da || b || c ||...语法

  • 需要帮助

注意事项(或意识)

  • 在版本1.x中,调用if()方法返回Conditional的实例,因此不要在同一个实例上两次调用它,例如
// This is Wrong!

Conditional::if(true)
    ->then(1)
    ->else(2)
    ->if('1'); // Don't do it except you intend to start a new and fresh if Conditional

见:tests/ConditionalTest::testEveryIfCallCreatesNewFreshInstance测试。在该测试的最后一条语句中,两个条件不是相同的。

  • Conditional依赖于闭包来返回传递给then的非闭包值。

在未来版本中,对于then和else方法,将可选使用闭包

贡献

  • 需要更多测试
  • 已打开问题
  • 关于那些静态属性,有什么想法可以减少使用的数量?
  • 性能优化(?)

开发

对于新功能,请使用前缀feat-#issueid进行检出,例如feature-#100-add-auto-deloy

  • 克隆此存储库
  • 运行sh dockerizer.shbash dockerizer.sh
  • 在docker环境中执行,使用docker-compose exec conditional shsh可以是另一个bash)
  • 使用vendor/bin/phpunit运行测试

许可证

MIT(见LICENCE文件)

其他信息

其他相关包