omitobisam / conditional
面向对象风格的if-else语句的流畅助手
2.0.0
2024-04-30 21:10 UTC
Requires
- php: >=7.4
Requires (Dev)
- phpunit/phpunit: ~8.0
- symfony/var-dumper: ^6.4
README
关于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 && d
或a || 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.sh
或bash dockerizer.sh
- 在docker环境中执行,使用
docker-compose exec conditional sh
(sh
可以是另一个bash) - 使用
vendor/bin/phpunit
运行测试
许可证
MIT(见LICENCE文件)
其他信息
其他相关包
- https://github.com/transprime-research/piper [以面向对象的方式实现的功能PHP管道]
- https://github.com/transprime-research/arrayed [以面向对象的方式实现的智能PHP数组类]
- https://github.com/transprime-research/attempt [智能PHP try...catch语句]
- https://github.com/omitobi/carbonate [智能Carbon + Collection包]
- https://github.com/omitobi/laravel-habitue [带有Collections响应的Jsonable Http Request(er)包]