yceruto / option-type
表示可选值的Option类型
v1.0.6
2024-08-05 01:20 UTC
Requires
- php: >=8.2
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.54
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^11.1
README
Option类型表示可能存在或可能不存在的值。这是PHP中关于null安全性的全部。
注意
受Rust的Option类型和其他语言如Scala、Swift、F#等的启发。
安装
composer require yceruto/option-type
使用null处理值的缺失或存在
在PHP中,用null表示值的缺失,例如,当divide函数在除数为0时返回null。
function divide(int $dividend, int $divisor): ?int { if (0 === $divisor) { return null; } return intdiv($dividend, $divisor); } function success(int $result): string { return sprintf('Result: %d', $result); } $result = divide(10, 2); echo success($result);
你能在这段代码中找到问题吗?显然,直到你尝试除以零,一切看起来都很好。该函数将返回null,而success()函数将抛出TypeError,因为它期望一个int值,而不是null。
这种方法的缺点是很容易忽略检查值是否为null,从而导致运行时错误,这就是Option类型发挥作用的地方:它总是强制你处理null的情况。
使用Option处理值的缺失或存在
Option通常与模式匹配一起使用来检查是否存在值,并相应地采取行动,始终确保处理null情况。
use Std\Type\Option; use function Std\Type\Option\none; use function Std\Type\Option\some; /** * @return Option<int> */ function divide(int $dividend, int $divisor): Option { if (0 === $divisor) { return none(); } return some(intdiv($dividend, $divisor)); } function success(int $result): string { return sprintf('Result: %d', $result); } // The return value of the function is an Option $result = divide(10, 2); // Pattern match to retrieve the value echo $result->match( // The division was valid some: fn (int $v) => success($v), // The division was invalid none: fn () => 'Division by zero!', );
提示
你可以使用函数some()和none()作为创建Option实例的快捷方式。some()就像new Some(),意味着它包含一个值,而none()与new None()相同,表示它缺失一个值。
文档
许可证
此软件根据MIT许可证发布。