rybakit / arguments-resolver
ArgumentsResolver 允许您确定要传递给函数或方法的参数。
v0.6.2
2021-06-22 13:40 UTC
Requires
- php: ^7.1|^8
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.13
- phpunit/phpunit: ^7.1|^8|^9
README
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! )
解析器
该库包含两个解析器,分别是 InDepthArgumentsResolver 和 NamedArgumentsResolver。它们都期望提供一个函数作为单个构造函数参数。该函数可以是任何 可调用,表示类方法的字符串 或 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 文件。