jjware/php-optional

此包已被 弃用 并不再维护。作者建议使用 jjware/option 包代替。

PHP 中处理可选值的库

v1.0.1 2017-10-25 16:28 UTC

This package is not auto-updated.

Last update: 2023-06-28 15:34:21 UTC


README

Build Status

基于 Java 接口的 PHP 可选结构

入门

composer require jjware/php-optional

创建

Optional 类位于命名空间 JJWare\Util

您可以通过调用静态方法 of 来创建一个 Optional

$opt = Optional::of('example value');

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

$opt = Optional::ofNullable($value);

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

$opt = Optional::empty();

使用方法

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

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

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

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

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

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

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

// or using an instance method reference

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

值的缺失可能对您来说是一个异常情况

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

如果您需要以某种方式更改 Optional 中的值(如果存在),您可能需要这样做

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

// or using a function reference

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

您可能需要一个映射到完全不同的 Optional

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

// or as a function reference

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

除非值满足特定标准,否则您可能不想使用该值

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

// or using a static method reference

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

如果值存在,您可能想做一些事情

getSetting('port')->ifPresent(function ($x) use ($configBuilder) {
    $configBuilder->setPort($x);
});

// or as an instance method reference

getSetting('port')->ifPresent([$configBuilder, 'setPort']);

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

$port = getSetting('port');

if ($port->isPresent()) {
    $value = $port->get();
}