rikta/callback-switch

基于回调的多用途类似switch语句的对象

v1.0.0 2021-01-15 16:09 UTC

README

GitHub issues GitHub license Packagist PHP Version Support Packagist Version

高级switch语句作为类

描述

此包提供将类似switch语句的逻辑封装到对象实例中的类。

您提供几个回调及其键,然后像方法一样调用实例。(还有一个静态的单方法调用)

这使您可以抽象出常用的切换逻辑,动态构建案例,甚至可以注入一些条件作为依赖,例如在DI或策略模式中。

此包提供的抽象包括

  • SwitchByIsA -> 键是接口(FQCN),优先级由添加回调的顺序确定(先来先得)
  • SwitchByType -> 键是内置类型或FQCN,FQCN具有更高的优先级
  • SwitchByValue -> 键是值
  • SwitchBySubstring -> 键是传递值的子字符串;优先级由添加回调的顺序确定(先来先得)

您也可以通过扩展AbstractCallbackSwitch并实现选择使用哪个回调的唯一抽象方法,轻松实现自己的CallbackSwitches

安装

使用composer require rikta/callback-switch要求此包

用法

案例

无论您的具体调用是什么,您都应将案例作为带有相关键的callables提供。

callable将获得$value作为第一个参数,以及...$extra作为其余参数。

您选择的键取决于您使用的switch类型。例如,如果您使用SwitchByValue,则它必须与(string)$value完全匹配,如果您使用SwitchByType,则它必须与$value的类型或类匹配

使用实例

创建

您可以使用带有可选的['key' => fn($value, ...$extra)]数组的CallbackSwitch实现创建一个类。

$exampleSwitch = new SwitchByType([
    SwitchByType::string => staticfn($value) => ('Hello ' . $value),
    SwitchByType::int => staticfn($value) => ('Hello Agent '. $value),
])

添加案例

您可以使用addCase($key, $callable)将案例添加到CallbackSwitchInstance中

$exampleSwitch->addCase(SwitchByType::array, fn($value) => ('Hello ' . implode(' and ', $value)))

设置为可选

默认情况下,如果没有找到匹配的案例,也没有提供默认值,则CallbackSwitch将抛出异常。

如果您将实例标记为“可选”,则将返回null

有两种方法可以将实例标记为可选

  • 您可以将true作为构造函数的第二个参数传递
$exampleSwitch = new SwitchByType([...], true)
  • 您可以在实例上调用setOptional()
$exampleSwitch->setOptional()

调用

每个实现SwitchCallback的类都是可调用的,就像是一个方法。

将您的$value作为第一个参数传递,它将用于确定案例并将其传递给回调。您在这里传递的任何额外参数也将传递给回调。

echo $exampleSwitch(['Anna', 'Bob']);

完整示例

$exampleSwitch = new SwitchByType([
    SwitchByType::string => staticfn($value) => ('Hello ' . $value),
    SwitchByType::int => staticfn($value) => ('Hello Agent '. $value),
]);

$exampleSwitch
    ->addCase(SwitchByType::array, fn($value) => ('Hello ' . implode(' and ', $value)))
    ->setOptional();

echo $exampleSwitch('World'); // Hello World
echo $exampleSwitch(['Jay', 'Bob']); // Hello Jay and Bob
echo $exampleSwitch(47); // Hello Agent 47

没有实例

如果您只需使用一次CallbackSwitch,则可以调用静态版本。

$value = 'World';
echo SwitchByType::switch($value, [
    SwitchByType::string => staticfn($value) => ('Hello ' . $value),
    SwitchByType::int => staticfn($value) => ('Hello Agent '. $value),
    SwitchByType::array => staticfn($value) => ('Hello ' . implode(' and ', $value)))
]) // Hello World;

设置为可选

默认情况下,如果没有找到匹配的案例,也没有提供默认值,则CallbackSwitch将抛出异常。

如果您调用::switchOptional而不是::switch,则将返回null

贡献

总是欢迎贡献。

如果您想贡献,我建议您首先查看CONTRIBUTING.md

许可

MIT