andydune/conditional-execution

它允许代码片段的更美观和可测试的条件执行。

v1.9.0 2018-06-22 13:38 UTC

This package is auto-updated.

Last update: 2024-09-07 06:24:49 UTC


README

Build Status Software License Packagist Version Total Downloads

它允许代码片段的更美观和可测试的条件执行。无缩进的代码行可以防止错误出现并提高可读性。

需求

  • 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

闭包作为条件和参数

您可以使用闭包作为条件。函数可以接收使用doItcheck方法插入的参数。

$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