ascetik/callapsule

封装可调用的方法

v0.4.0 2023-11-16 18:22 UTC

This package is auto-updated.

Last update: 2024-09-16 20:24:25 UTC


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 实例,该方法返回可调用数组。