rybakit/arguments-resolver

ArgumentsResolver 允许您确定要传递给函数或方法的参数。

v0.6.2 2021-06-22 13:40 UTC

This package is auto-updated.

Last update: 2024-09-10 05:48:52 UTC


README

Quality Assurance Scrutinizer Code Quality Code Coverage

ArgumentsResolver 允许您确定要传递给函数或方法的参数。

安装

推荐通过Composer安装 ArgumentsResolver

composer require rybakit/arguments-resolver

使用示例

use ArgumentsResolver\InDepthArgumentsResolver;

$greet = function ($username, DateTime $date, $greeting = 'Hello %s!') {
    // ...
};

$parameters = [
    'Welcome %s!',
    ['foo'],
    new DateTime(),
    'username' => 'Stranger',
    'bar',
];

$arguments = (new InDepthArgumentsResolver($greet))->resolve($parameters);
print_r($arguments);

上述示例将输出

Array
(
    [0] => Stranger
    [1] => DateTime Object (...)
    [2] => Welcome %s!
)

解析器

该库包含两个解析器,分别是 InDepthArgumentsResolverNamedArgumentsResolver。它们都期望提供一个函数作为单个构造函数参数。该函数可以是任何 可调用表示类方法的字符串ReflectionFunctionAbstract 的实例

new InDepthArgumentsResolver(['MyClass', 'myMethod']);
new InDepthArgumentsResolver([new MyClass(), 'myMethod']);
new InDepthArgumentsResolver(['MyClass', 'myStaticMethod']);
new InDepthArgumentsResolver('MyClass::myStaticMethod');
new InDepthArgumentsResolver('MyClass::__construct');
new InDepthArgumentsResolver(['MyClass', '__construct']);
new InDepthArgumentsResolver(new MyInvokableClass());
new InDepthArgumentsResolver(function ($foo) {});
new InDepthArgumentsResolver('MyNamespace\my_function');
new InDepthArgumentsResolver(new ReflectionMethod('MyClass', 'myMethod'));
new InDepthArgumentsResolver(new ReflectionFunction('MyNamespace\my_function'));

还有一个实用类,它可以帮助创建反射实例

use ArgumentsResolver\ReflectionFactory;

$reflection = ReflectionFactory::create('MyClass::__construct');
$resolver = new InDepthArgumentsResolver($reflection);

InDepthArgumentsResolver

InDepthArgumentsResolver 中,是否匹配参数值的决策受多个因素的影响,即参数的类型、类层次结构(如果是对象)、参数名称和参数位置。

为了澄清,依次考虑每种情况

参数类型

function foo(array $array, stdClass $object, callable $callable) {}

(new InDepthArgumentsResolver('foo'))->resolve([
    ...
    function () {},    // $callable
    ...
    new stdClass(),    // $object
    ...
    [42],              // $array
    ...
]);

类层次结构

function foo(Exception $e, RuntimeException $re) {}

(new InDepthArgumentsResolver('foo'))->resolve([
    ...
    new RuntimeException(),    // $re
    ...
    new Exception(),           // $e
    ...
]);

参数名称

function foo($a, $b) {}

(new InDepthArgumentsResolver('foo'))->resolve([
    ...
    'c' => 3,
    'b' => 2,    // $b
    'a' => 1,    // $a
    ...
]);

参数位置

function foo($a, $b) {}

(new InDepthArgumentsResolver('foo'))->resolve([
    1,   // $a
    2,   // $b
    ...
]);

NamedArgumentsResolver

NamedArgumentsResolver 是一个非常简单的解析器,它只通过参数名称进行匹配。因此,这需要参数是一个关联数组

function foo($a, array $b, $c = null) {}

(new NamedArgumentsResolver('foo'))->resolve([
    ...
    'b' => [],       // $b
    'a' => 1,        // $a
    'c' => 'bar',    // $c
    ...
]);

测试

ArgumentsResolver 使用 PHPUnit 进行单元测试。为了运行测试,您需要首先使用 composer 设置测试套件

composer install

然后您可以运行测试

vendor/bin/phpunit

许可证

ArgumentsResolver 在 MIT 许可证下发布。有关详细信息,请参阅捆绑的 LICENSE 文件。