ustream/option

0.1.0 2013-03-11 15:37 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:17:59 UTC


README

这是对Option类型的PHP实现,具有单调结构。我们认为测试文档记录了行为,尽管实现与php-option类似,但仍有重要的差异需要强调。

apply而不是mapflatMap

我们发现,单调计算可以决定返回任意类型,必要时将其转换为Option

Some::apply的规则如下

  • 如果返回类型不是Option,则将其包装在Some
  • 如果没有返回值(实际上返回值是null),则将其转换为None
  • 如果返回类型是Option,则将其传递(与flatMap相同)

示例

包装非Option类型

$result = someMethodReturningAnOptionalString($params)
	->apply(
		function ($result) {
			return $result . ' is a string!';
		})
	->getOrElse('default');

无需显式返回None

$module = $dataMaybe
    ->apply(
		function ($data) {
			if (isset($data['moduleConfig'])) {
				if (count($data['moduleConfig']) == 1) {
					return key($data['moduleConfig']);
				} elseif (count($data['moduleConfig']) > 1) {
					return 'full';
				}
			}
		}
	)
	->getOrElse('unknown');

otherwise代替orElseLazyOption

我们使用None::otherwise作为Some::apply的镜像。

示例

结合apply和otherwise

header(
    locate($_SERVER["DOCUMENT_URI"])
		->apply(
			function ($location) {
				statsdIncrement('302');
				return 'Location: ' . $location;
			}
		)
		->otherwise(
			function () {
				statsdIncrement('404');
			}
		)
		->getOrElse("HTTP/1.0 404 Not Found")
);

创建一系列回退函数链

return Ustream\Option\None::create()
    ->otherwise($this->ustreamPicture($userId, $size))
	->otherwise($this->facebookPictureFromSession($facebookNetwork, $isSecureAccess))
	->getOrElse($this->naPicture($size));