prewk/result

受Rust启发的PHP结果对象


README

这是一个PHP实现,模仿了Rust的Result类型,API基本相同。

版本信息

版本4.x.x需要PHP 8.1.0及以上。如果您同时使用此库和Option库,请确保版本匹配。

安装

composer require prewk/result

概述

use Prewk\Result;
use Prewk\Result\{Ok, Err};

function someApiCall(): Result {
    // ...
    if ($apiCallSuccesful) {
        return new Ok($results);
    } else {
        return new Err($error);
    }
}

function anotherApiCall(): Result {
    // ...
    if ($apiCallSuccesful) {
        return new Ok($results);
    } else {
        return new Err($error);
    }
}

// Fallback to value
$value = someApiCall()->unwrapOr(null);

// Fallback to result and throw an exception if both fail
$value = someApiCall()->orElse(function($err) {
	return anotherApiCall();
})->unwrap();

// Throw custom exception on error
$value = someApiCall()->expect(new Exception("Oh noes!"));

辅助函数

存在可选的全局辅助函数,用于简化结果对象的构建。

ok(); // new Prewk\Result\Ok(null);
ok($val); // new Prewk\Result\Ok($val);
err($e); // new Prewk\Result\Err($e);

将以下内容添加到您的 composer.json 文件中:

{
  "autoload": {
    "files": ["vendor/prewk/result/helpers.php"]
  }
}

Rust API差异

异常

如果解包包含 ExceptionErr,则抛出该异常。否则,将抛出通用的 ResultException

注意事项

注意,orand 将立即进行评估。

// This will call all three api calls regardless of successes/errors
$this
	->apiCall()
	->or(anotherApiCall())
	->and(thirdApiCall());

请参阅 andThenorElse 以实现延迟评估。

许可证

MIT & Apache 2.0