andydune / conditional-execution
它允许代码片段的更美观和可测试的条件执行。
v1.9.0
2018-06-22 13:38 UTC
Requires
- php: ^5.6 || ^7
Requires (Dev)
- phpunit/phpunit: ^5.7.15 || ^6.0.8
README
它允许代码片段的更美观和可测试的条件执行。无缩进的代码行可以防止错误出现并提高可读性。
需求
- PHP版本 >= 5.6
- 商店里朋友的一颗糖果
安装
使用composer安装
composer require andydune/conditional-execution
如果没有全局安装composer
php composer.phar require andydune/conditional-execution
或编辑你的composer.json
"require" : {
"andydune/conditional-execution": "^1"
}
并执行命令
php composer.phar update
发现问题
这里的条件执行。我在很多CMS中经常遇到这种情况。
if ((empty($arParams["PAGER_PARAMS_NAME"]) || !preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["PAGER_PARAMS_NAME"])) && $arParams["SECTION_ID"] > 0 && $arParams["SECTION_ID"]."" != $arParams["~SECTION_ID"] ) { // some php code // fuction call or method }
难以阅读,搜索错误或编辑。
这是库提供的更好方式。
use AndyDune\ConditionalExecution\ConditionHolder; $instanceOr = new ConditionHolder(); $instanceOr->bindOr() ->add(empty($arParams["PAGER_PARAMS_NAME"])) ->add(!preg_match("/^[A-Za-z_][A-Za-z01-9_]*$/", $arParams["PAGER_PARAMS_NAME"])); $instanceTotal = = new ConditionHolder(); // default bind AND $instanceTotal->executeIfTrue(function(){ // some php code // fuction call or method }); $instanceTotal->add($instanceOr) ->add($arParams["SECTION_ID"] > 0) ->add($arParams["SECTION_ID"]."" != $arParams["~SECTION_ID"]); $result = $instanceTotal->doIt(); // yes, do it!
方法
add($condition)
将条件添加到队列中。条件不会立即检查。它可以是一个可调用对象。
bindAnd()
更改条件的绑定逻辑为AND。AND是默认选项。
bindOr()
更改条件的绑定逻辑为OR。
check()
执行所有收集到的条件的检查。
doIt()
检查所有收集到的条件并执行适当的函数和触发器。
好处
简单添加或删除条件
您不需要计算括号。添加和删除条件很简单。
use AndyDune\ConditionalExecution\ConditionHolder; $instance = new ConditionHolder(); $instance->add($val1 > $val2); $instance->add($someObject->isGood()); $instance->check(); // true $instance->add(''); $instance->check(); // false $instance->bindOr(); $instance->check(); // true
闭包作为条件和参数
您可以使用闭包作为条件。函数可以接收使用doIt或check方法插入的参数。
$instance = new ConditionHolder(); $instance->add(function ($value) { if ($value > 2) { return true; } return false; }); $instance->executeIfTrue(function () { return 'Y'; }); $instance->executeIfFalse(function () { return 'N'; }); $instance->doIt(3); // returns 'Y' $instance->chack(3); // returns true $instance->doIt(1); // returns 'N' $instance->chack(1); // returns false
检查类以进行任何复杂性的检查
存在任何复杂性的检查机制。它描述为AndyDune\ConditionalExecution\Check\CheckAbstract的实例。
您可以创建自己的自定义类并使用它。
ArrayValueWithKeyNotEmpty
检查数组值和键是否为空。
use AndyDune\ConditionalExecution\Check\ArrayValueWithKeyNotEmpty; use AndyDune\ConditionalExecution\ConditionHolder; // Source array $array = [ 'one' => 1 ]; $condition = new ConditionHolder(); $condition->add(new ArrayValueWithKeyNotEmpty('one')); $condition->check($array); // result is true $condition->setNegative(); $condition->check($array); // result is false
ArrayHasNotEmptyValueOrKeyNotExist
给定数组键必须不存在或保持值== true不变
use AndyDune\ConditionalExecution\Check\ArrayHasNotEmptyValueOrKeyNotExist; use AndyDune\ConditionalExecution\ConditionHolder; $array = [ 'one' => 1, 'two' => '', 'three' => 0 ]; $condition = new ConditionHolder(); $condition->add(new ArrayHasNotEmptyValueOrKeyNotExist('one'))->check($array); // true $condition = new ConditionHolder(); $condition->add(new ArrayHasNotEmptyValueOrKeyNotExist('two'))->check($array); // false $condition = new ConditionHolder(); $condition->add(new ArrayHasNotEmptyValueOrKeyNotExist('three'))->check($array); // false $condition = new ConditionHolder(); $condition->add(new ArrayHasNotEmptyValueOrKeyNotExist('four'))->check($array); // true
为获取第一个结果执行列表中的函数
use AndyDune\ConditionalExecution\GetFirstSuccessResult; $instance = new GetFirstSuccessResult(); $instance->add(function () { return ''; }); $instance->add(function () { return 'two'; }); $instance->get(); // resturns 'two'
带参数
$instance = new GetFirstSuccessResult(); $instance->add(function ($string, $length = 5) { if (strlen($string) < $length) { return $string . '<'; } return false; }); $instance->add(function ($string, $length = 5) { if (strlen($string) > $length) { return $string . '>'; } return false; }); $instance->get('two', 4); // returns 'two<' $instance->get('two', 2); // returns 'two>' $instance->get('onetwo', 4); // returns onetwo> $instance->get('tw', 2); returns false