jjware/option

PHP Option 累加类型

1.1.0 2018-05-31 20:42 UTC

This package is not auto-updated.

Last update: 2024-09-15 05:18:25 UTC


README

Build Status

PHP 的 Option 累加类型

入门

composer require jjware/option

创建

Option 位于命名空间 JJWare\Utils\Option

您可以通过调用静态方法 some 创建一个 Option

$opt = Option::some('example value');

如果您有一个可能包含 null 值的变量,您可以使用静态方法 nullable

$opt = Option::nullable($value);

如果您有一个需要返回空值的情况,您可以使用静态方法 none

$opt = Option::none();

用法

一旦您有了 Option,您可以对它执行许多操作。

假设我们有一个可能返回或不返回值的功能

function getSetting(string $setting) : Option
{
    // Try to find the setting if it exists...
    return Option::nullable($result);
}

如果您的 Option 为空,您可以在其中提供一个默认值

$port = getSetting('port')->getOrElse(8080);

如果您的默认值需要昂贵的计算或调用外部资源,您可能只想在必要时获取默认值

$port = getSetting('port')->getOrElseGet(function () use ($db) {
    return $db->getDefaultPortFromDatabase();
});

// or using an instance method reference

$port = getSetting('port')->getOrElseGet([$db, 'getDefaultPortFromDatabase']);

没有值可能对您来说是一个异常情况

$port = getSetting('port')->getOrThrow(function () {
   return new UnderflowException("setting does not exist");
});

如果存在,您可能需要以某种方式更改 Option 内的值

$port = getSetting('port')->map(function ($x) {
   return intval($x);
})->getOrElse(8080);

// or using a function reference

$port = getSetting('port')->map('intval')->getOrElse(8080);

您可能需要映射到完全不同的 Option

$scheme = getSetting('port')->flatMap(function ($x) {
   return getSchemeForPort($x);
})->getOrElse('http');

// or as a function reference

$scheme = getSetting('port')->flatMap('getSchemeForPort')->getOrElse('http');

除非它符合特定标准,否则您可能不想要值

$port = getSetting('port')->filter(function ($x) {
    return $x >= 1024 && $x <= 49151;
})->getOrElse(8080);

// or using a static method reference

$port = getSetting('port')->filter('Filters::registeredPort')->getOrElse(8080);

假设您需要测试值是否存在

$port = getSetting('port');

if (!$port->isSome()) {
    $log->debug("port setting empty");
    throw new InvalidArgumentException("port not provided");
}