jimmyoak / optional
2.2.0
2016-10-28 10:22 UTC
Requires
- php: >=7.0
Requires (Dev)
- phpunit/phpunit: ^5.5
README
Java 9的java.util.Optional的PHP改进版本。
一些示例
基本用法
示例请求类
class Request { private $date; // ... constructor and getter ... }
optional的示例代码
$date = Optional::ofNullable($request->getDate()) ->map(function ($dateString) { return DateTime::createFromFormat('Y-m-d', $dateString); }) ->orElseGet(function () { return new \DateTime(); }); echo $date->format('Y-m-d');
给定此请求
$request = new Request('1992-10-07');
程序将输出 1992-10-07
。
如果在请求中指定了null
$request = new Request(null);
则程序将输出默认值,在这种情况下可能是类似 2016-08-19
的值
而不是返回默认值,我们可以抛出异常以处理没有值的情况
$date = Optional::ofNullable($request->getDate()) ->map(function ($dateString) { return DateTime::createFromFormat('Y-m-d', $dateString); }) ->orElseThrow(new \Exception());
在这种情况下
$request = new Request(null);
程序将抛出指定的异常,否则将返回指定的解析日期。
或者
我们可以链式调用Optionality
$findInMemory = function () { ... return Optional::ofNullable(...); }; $findInDisc = function () { ... return Optional::ofNullable(...); }; $findRemotely = function () { ... return Optional::ofNullable(...); }; $optional = $findInMemory() ->or($findInDisc) ->or($findRemotely);
只有当最后一个optional为空时,回调函数才会执行。例如
$findInMemory = function () { echo "Searching in memory...\n"; return Optional::empty(); }; $findInDisc = function () { echo "Searching in disc...\n"; return Optional::of("Awesome"); }; $findRemotely = function () { echo "Searching remotely..."; return Optional::of("Not so awesome"); }; $findInMemory() ->or($findInDisc) ->or($findRemotely) ->ifPresent(function ($value) { echo $value; });
将输出
Searching in memory...
Searching in disc...
Awesome
过滤器
$request = new Request('1992-10-07'); $makeDateTime = function ($value) { return \DateTime::createFromFormat('Y-m-d', $value); }; $beforeNow = function (\DateTime $date) { return $date->getTimestamp() > (new \DateTime())->getTimestamp(); }; $date = Optional::ofNullable($request->getDate()) ->map($makeDateTime) ->filter($beforeNow) ->orElse(new \DateTime()); echo $date->format('Y-m-d');
输出(类似):2016-08-19
当:$request = new Request('2030-01-01');
输出:2030-01-01
当:$request = new Request(null);
输出:2016-08-19
ifPresent
Optional::ofNullable($request->getDate()) ->ifPresent(function ($value) { echo "It's present: " . $value; });
如果有值,将输出:存在值:1992-10-07
否则不执行任何操作。
ifPresentOrElse
类似于ifPresent,但在optional为空时有else回调
Optional::ofNullable($request->getDate()) ->ifPresentOrElse(function ($value) { echo "It's present: " . $value; }, function() { echo 'No value is present'; });
如果有值,将输出:存在值:1992-10-07
否则,将输出:没有值
可比较的
返回true
Optional::of('something')->equals(Optional::of('something'));
返回false
Optional::of(5)->equals(Optional::of('something'));
返回true
Optional::empty()->equals(Optional::empty());
返回false
Optional::empty()->equals(Optional::of(5));
__toString
echo (string) Optional::of('something');
输出:Optional[something]
echo (string) Optional::empty();
输出:Optional.empty