smpita / typeas
静态分析中的类型控制简易化
Requires
- php: ^8.1
Requires (Dev)
- larastan/larastan: ^2.0.1
- laravel/pint: ^1.0
- orchestra/testbench: ^8.4|^9.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
README
在进行静态分析时,你是否在为处理混合签名而苦恼?
Smpita/TypeAs 将为你提供轻松控制类型的解决方案。
安装
您可以通过 composer 安装此包。
composer require smpita/typeas
用法
有关当前方法和签名的列表,请参阅 SIGNATURES。
通用用法
传递一个 $mixed
,如果 $mixed
无法转换,将抛出 TypeAsResolutionException
。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::string($mixed);
如果您想抑制抛出异常,请提供默认值。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::string($mixed, '');
类方法
class()
的签名略有不同,因为您需要指定期望的类。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::class(Target::class, $mixed);
您仍然可以提供默认值。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::class(Target::class, $mixed, new \StdClass);
注意:在 v2.0.0
之前的版本中,签名的顺序不同。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::class($mixed, Target::class, $default);
数组方法
默认情况下,array()
将将非迭代对象包装成类似 (array) $mixed
的形式,而不是抛出异常。
use Smpita\TypeAs\TypeAs; TypeAs::array('example') === ['example'];
这不一定总是合适的,因此您可以选择关闭包装以获取异常。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::array($mixed, false);
或者,您也可以提供一个默认值。
use Smpita\TypeAs\TypeAs; $typed = TypeAs::array($mixed, []);
可空类型
从 v2.3.0
开始,如果希望在抛出异常而不是接收 null
时,每个类型方法都有一个可空的对应方法。
use Smpita\TypeAs\TypeAs; TypeAs::nullableString(new \stdClass) === null
解析器
SIGNATURES#resolver-registration
从 v2.4.0
开始,您可以指定自己的自定义解析器。
每个类型都有一个位于 Smpita\TypeAs\Contracts
的关联接口,您可以实现该接口来创建自己的解析器。
简单实现该接口,然后注册解析器或在使用解析器方法时使用它。
接口
Smpita\TypeAs\Contracts\ArrayResolver
Smpita\TypeAs\Contracts\BoolResolver
Smpita\TypeAs\Contracts\ClassResolver
Smpita\TypeAs\Contracts\FloatResolver
Smpita\TypeAs\Contracts\IntResolver
Smpita\TypeAs\Contracts\NullableArrayResolver
Smpita\TypeAs\Contracts\NullableClassResolver
Smpita\TypeAs\Contracts\NullableFloatResolver
Smpita\TypeAs\Contracts\NullableIntResolver
Smpita\TypeAs\Contracts\NullableStringResolver
Smpita\TypeAs\Contracts\StringResolver
创建自定义解析器
use Smpita\TypeAs\Contracts\StringResolver; class CustomStringResolver implements StringResolver { /** * @throws \UnexpectedValueException */ public function resolve(mixed $value, string $default = null): string { // Your logic here } }
注册自定义解析器
全局
要全局注册解析器,请使用相关的设置方法。在 Laravel 中,建议在 ServiceProvider
的 boot 方法中这样做。
TypeAs::setStringResolver(new CustomStringResolver);
单次使用
$typed = Smpita\TypeAs::string($mixed, null, new CustomStringResolver);
注销自定义解析器
要返回默认值,只需将解析器设置为 null
。
TypeAs::setStringResolver(null);
要使所有解析器返回默认值,您可以使用 useDefaultResolvers()
。
TypeAs::useDefaultResolvers();
如果您注册了自定义解析器并希望在单次使用中使用默认解析器,将 null
传递给解析器方法将不起作用。您必须传递默认解析器。
$typed = Smpita\TypeAs::string($mixed, null, new \Smpita\TypeAs\Resolvers\AsString);
辅助函数
从 v2.5.0
开始,解析器方法在 Smpita\TypeAs
命名空间中有一个相关的辅助方法。辅助方法名称遵循 TypeAs
方法名称,但以 as
开头,并使用 camelCased 格式。
use function Smpita\TypeAs\asString; $typed = asString($mixed);
弃用
测试
composer test
变更日志
请参阅 CHANGELOG 以获取有关最近更改的更多信息。
贡献
请参阅CONTRIBUTING以获取详细信息。
安全漏洞
请查阅我们的安全策略了解如何报告安全漏洞。
致谢
许可协议
MIT 许可协议(MIT)。请参阅许可文件以获取更多信息。