yceruto/option-type

表示可选值的Option类型

资助包维护!
yceruto

v1.0.6 2024-08-05 01:20 UTC

This package is auto-updated.

Last update: 2024-09-05 01:35:39 UTC


README

Latest Stable Version Unstable License PHP Version Require

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许可证发布。