rikta / callback-switch
基于回调的多用途类似switch语句的对象
Requires
- php: >=7.4
- ext-json: *
Requires (Dev)
- mockery/mockery: ^1.4
- phpstan/phpstan: ^0.12
- phpstan/phpstan-mockery: ^0.12.7
- phpstan/phpstan-phpunit: ^0.12
- phpunit/phpunit: ^9.4
- roave/security-advisories: dev-master
- squizlabs/php_codesniffer: ^3.5
This package is auto-updated.
Last update: 2024-09-10 09:25:31 UTC
README
高级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。