pocketmine/callback-validator

daverandom/callback-validator 的分支 - 验证回调签名的工具

1.0.3 2020-12-11 01:45 UTC

README

验证回调签名与原型。

这是 PocketMine-MP 使用的 daverandom/callback-validator 的分支。除更多测试版本、更新依赖项和为包使用而标记的版本外,与上游存储库相比没有显著变化。

由于上游版本没有发布,这影响了使用它的包的 composer 稳定性。这导致依赖于 pocketmine/pocketmine-mp 的包出现问题,因为它们无法接收其最新版本。

状态

CI

使用方法

// Create a prototype function (can be any callable)
$prototype = function (A $a, B $b, $c): ?string {};

// Validate that callables match the prototype
$tests = [
    $prototype, // true
    function (A $a, B $b, $c) {}, // false - return type does not match
    function ($a, $b, $c): ?string {}, // true - arguments are contravariant
    function (A $a, B $b): ?string {}, // true - extra args don't cause errors
    function (A $a, B $b, $c, $d): ?string {}, // false - Insufficient args cause an error
    function (C $a, B $b, $c): ?string {}, // true if C is a supertype of A, false otherwise
    function (SuperTypeOfA $a, B $b, $c): ?string {}, // true
    function (A $a, B $b, $c): string {}, // true - return types are covariant
];

// Create a type from a prototype
$type = CallbackType::createFromCallable($prototype);

run_tests($type, $tests);

// ...or create a type by hand for more granular control over variance rules
$type = new CallbackType(
    new ReturnType(BuiltInTypes::STRING, ReturnType::NULLABLE | ReturnType::COVARIANT),
    new ParameterType('a', A::class),
    new ParameterType('b', B::class),
    new ParameterType('c')
);

run_tests($type, $tests);

function run_tests(CallbackType $type, array $tests)
{
    foreach ($tests as $test) {
        if ($type->isSatisfiedBy($test)) {
            echo "pass\n";
        } else {
            // CallbackType implements __toString() for easy inspections
            echo CallbackType::createFromCallable($test) . " does not satisfy {$type}\n";
        }
    }
}

待办事项

  • 更多测试
  • 解释(文本解释为什么回调验证失败)