sepiariver/binliner-php

PHP的二进制序列验证器

1.0.0-pl 2022-03-04 17:09 UTC

This package is auto-updated.

Last update: 2024-09-07 03:52:33 UTC


README

PHP的二进制序列验证器

关于

这是什么?

Binliner类似于一个工厂,用于生成状态机。给定参数$config['size'],一个实例将拥有有限数量的可能状态,可以使用$config['validation']参数配置为有效,排除所有其他状态。

isValid()方法返回一个布尔值:当前状态是否为配置为有效的状态之一,类似于一个接受者。实例可以被强制转换为string或转换为number,在这两种情况下都返回状态的相应表示,类似于一个分类器。这个输出可以被映射到另一组值,这些值服务于特定的业务场景——整个实现因此就像一个摩尔机

通过向$config['validation']传递一个函数,可以绕过Binliner的确定性行为,引入副作用或任何其他所需的自定义验证逻辑。此时,Binliner的实用性可能会受到质疑,尽管它似乎有助于阐明复杂的条件逻辑。

它不是什么

尽管名称中有垃圾收集,Binliner不是一个垃圾收集工具。它将二进制标志按顺序“排列”,由于它将验证序列与配置的规则进行比较,因此可以说它像Binliner一样“捕获垃圾”。

什么是二进制序列?

它是一系列位,每个位都有0或1的值。它通常用于数据传输、压缩或存储,但也可以用于错误检测和纠正等其他用途。通过使用数字索引数组的隐式排序来封装任意的布尔条件,Binliner可以以更紧凑、但仍透明/可读的方式促进复杂的控制流。

对于简单的控制流,Binliner可能不太合适,但在更复杂的情况下可能会有所帮助。它还允许重用条件状态。

安装

composer require sepiariver/binliner-php

用法

示例

如果鲍勃的年龄小于21岁,则拒绝。如果他的年龄在21到65岁之间,则检查他的驾照,如果无效则拒绝。如果他超过65岁且持有有效驾照,则重新测试。如果他没有通过测试或没有有效驾照,则拒绝。

注意:这个示例无意为年龄歧视辩护

use SepiaRiver\Binliner;

class Bob
{
    // define bob
};
$bob = new Bob();
$ofAge = ($bob->age > 20);               // Postiion 0 in the sequence
$needsRetest = ($bob->age > 65);         // Position 1
$validLicense = ($bob->license.valid);   // Position 2
$passedTest = ($bob->test.results > 60); // Position 3

/**
 * Truth table
 * ofAge | needsRetest | validLicense | passedTest
 * 1 | 0 | 1 | 0 // of age, valid license, test result irrelevant
 * 1 | 0 | 1 | 1 // of age, valid license, test result irrelevant
 * 1 | 1 | 1 | 1 // of age, valid license, passed test
 *
 * ALL OTHER STATES ARE INVALID 
 */

$config = [
    'size' => 4,
    'validation' => ['1010', '1011', '1111'],
];
$binliner = new Binliner(
    $config,
    $ofAge,
    $needsRetest,
    $validLicense,
    $passedTest
);

if (!$binliner->isValid()) {
    // Reject
    throw new Exception('Invalid state!');
}
// Just for convenience you can reason about intval((string)$binliner, 2);
if ($binliner->toInt() < 12) {
    // Accept
    return true;
}
// The only remaining valid state is '1111'
return handlePassedRetest($bob);

更多示例请参阅test/ExamplesTest.php

测试

  1. 克隆此存储库
  2. composer install
  3. vendor/bin/phpunit

贡献

将拉取请求提交到[https://github.com/sepiariver/binliner-php/pulls]