ascetik / callapsule
封装可调用的方法
v0.4.0
2023-11-16 18:22 UTC
Requires (Dev)
- phpunit/phpunit: ^10.4
README
封装可调用对象的方法
目的
此包旨在封装任何类型的可调用对象,提供以相同方式处理它们的能力。我需要此类包进行路由或服务管理,任何需要延迟的任务,正确封装可调用对象...
发布说明
v0.4.0
- CallableType 抽象 getReflection() 方法。
用法
使用 CallWrapper 工厂静态方法构建 CallableType
class Foo { public function bar(){} public function __invoke(){} public static function biz(){} } // To wrap a Closure $closureWrapper = CallWrapper::wrap(fn(string $name) => 'hello ' . $name); // or $closureWrapper = CallWrapper::wrapClosure(fn(string $name) => 'hello ' . $name); // to wrap an instance and a method to call $methodWrapper = CallWrapper::wrap([new Foo(), 'bar']); // or $methodWrapper = CallWrapper::wrapMethod(new Foo(), 'bar'); // to wrap a static method $staticWrapper = CallWrapper::wrap([Foo::class, 'biz']); // or $staticWrapper = CallWrapper::wrapStatic(Foo::class, 'biz'); // To wrap an invokable class $invokable = CallWrapper::wrap(new Foo()); // or $invokable = CallWrapper::wrapInvokable(new Foo());
使用此工厂是构建和使用的最佳选择。由于私有构造函数,一些检查使直接实例化不可用。
CallableType 能够运行它持有的可调用对象。对于外部需求,它能够以原始形式返回其可调用对象
$callable = $closureWrapper->callable(); echo call_user_func($callable,' John'); // prints "hello John" // or use it directly echo $closureWrapper->apply(['name' => 'John']); // same result
CallableType 方法
- CallableType::apply(?iterable): mixed : 执行可调用并返回结果
- CallableType::action(): callable : 返回封装的可调用对象类型提示为 callable
- CallableType::getCallable(): object : 返回完全类型提示的封装可调用对象
实现
我可以列出 4 个可调用封装的使用场景
- 闭包
- 一个类方法,带有一个实例和要运行的方法
- 一个静态类方法,使用类字符串而不是实例
- 具有 __invoke 魔法方法的实例
如果您能找到更多,请随时使用 CallableType 抽象。
ClosureCall
包含闭包。直接实例化(公共构造函数)
不抛出错误/异常
InvokableCall
包含可调用的实例。用于检查的静态工厂方法。
如果给定的实例不实现 __invoke() 方法,则抛出 UninvokableClassException。
MethodCall
包含一个实例和一个方法。用于检查的静态工厂方法。
如果给定方法未实现,则抛出 MethodNotImplementedException。
getCallable 方法返回一个具有 get() 方法的 ClassMethod 实例,该方法返回可调用数组。
StaticCall
包含类名和方法名。用于检查的静态工厂。
如果给定的类不存在,则抛出 ClassNotFoundException。如果给定的方法未实现,则抛出 MethodNotImplementedException。
getCallable 方法返回一个具有 get() 方法的 ClassMethod 实例,该方法返回可调用数组。