sroze / argument-resolver
一个轻量级的工具,根据类型和名称解析方法参数
2.0.4
2017-12-16 21:02 UTC
Requires (Dev)
- doctrine/common: ~2.5
- fabpot/php-cs-fixer: ~1.8
- phpspec/phpspec: ~2.2
README
这个轻量级库可以帮助开发者自动调用可调用对象(函数、方法或闭包)并传递一组可用的参数。开发者可以使用类型提示和/或特定的变量名称来选择他们想要的参数。
安装
建议的安装方法是使用composer
composer require sroze/argument-resolver
解析参数
可以通过使用ArgumentResolverFactory
类轻松地创建参数解析器
use ArgumentResolver\ArgumentResolverFactory; $argumentResolver = ArgumentResolverFactory::create();
resolveArguments
方法返回给定可调用对象解析后的参数的有序数组。该方法参数包括:
- 可调用对象
- 可用的参数,作为数组
以下是如何使用一组可用的参数来解析某些闭包参数的示例
$closures = [ function(MyClass $object) { return $object instanceof MyClass; }, function($bar, array $list) { return count($list); } ]; foreach ($closures as $callable) { $arguments = $argumentResolver->resolveArguments($callable, [ 'classObject' => new MyClass(), 'bar' => 'foo', 'list' => ['an', 'array'] ]); // ... }
除了类型提示的参数识别,还可以使用名称
class Foo { public function method($foo, $bar) { } } $argumentResolver->resolveArguments([new Foo(), 'method'], [ 'bar' => 1, 'foo' => 2, 'baz' => 3 ]); // Which returns: [2, 1]
为了防止可能的冲突,该库遵循规则章节中描述的优先级和约束。
可调用执行器
因为当你解析了给定可调用对象所需的参数时,通常是为了调用它,因此该库附带了一个CallableRunner
类,它会为你做所有事情。
$runner = new CallableRunner($argumentResolver); $runner->run($callable, $availableArguments);
实例化对象
有时,你可能希望用一组参数来实例化一个对象。以下是Instanciator
的使用方法。
$instantiator = new Instantiator($argumentResolver); $instantiator->instantiate(YourClassName::class, $availableArguments);
规则
优先级
以下是对参数解析的优先级
- 严格匹配:相同的名称和类型
- 类型匹配
- 名称匹配
约束
以下约束适用:
- 如果有多个相同类型的参数,则对此类型应用严格匹配
- 必需的参数必须解析