jjware / php-optional
v1.0.1
2017-10-25 16:28 UTC
Requires
- php: >=7.0.0
Requires (Dev)
- phpunit/phpunit: ^5.0
This package is not auto-updated.
Last update: 2023-06-28 15:34:21 UTC
README
基于 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(); }