最近在处理一些核心业务逻辑时,我发现代码中充斥着大量的
if ($result === false)
try-catch
false
try-catch
我常常在想,有没有一种更统一、更具表达力的方式来处理这些“成功”和“失败”的场景?既能清晰地知道操作是否成功,又能明确地获取到成功时的值或失败时的错误信息,而不是一个模棱两可的
false
Composer在线学习地址:学习地址
就在我为此烦恼时,我遇到了
ghostwriter/result
Result
Result<T, E>
Success
Failure
ghostwriter/result
null
false
ResultInterface
Success
Failure
Throwable
Result
false
try-catch
Failure
try-catch
Failure
安装与使用:
立即学习“PHP免费学习笔记(深入)”;
使用Composer安装非常简单:
<pre class="brush:php;toolbar:false;">composer require ghostwriter/result
下面我们通过一个“除法”的例子来看看
ghostwriter/result
<pre class="brush:php;toolbar:false;"><?php
require 'vendor/autoload.php';
use Ghostwriter\Result\Failure;
use Ghostwriter\Result\Result; // 静态工厂方法
use Ghostwriter\Result\Success;
use Ghostwriter\Result\ResultInterface; // 类型提示
// 模拟一个自定义异常
class DivisionByZeroError extends \Exception {}
/**
* 安全的除法函数,返回 Result 类型
*
* @param int $x 被除数
* @param int $y 除数
* @return ResultInterface<float, DivisionByZeroError>
*/
function divide(int $x, int $y): ResultInterface
{
if ($y === 0) {
// 如果除数为零,返回一个包含 DivisionByZeroError 的 Failure
return Result::failure(new DivisionByZeroError('除数不能为零!'));
}
// 否则,返回一个包含计算结果的 Success
return Result::success($x / $y);
}
// 示例 1:成功的情况
$result1 = divide(10, 2);
if ($result1 instanceof Success) {
echo "10 / 2 = " . $result1->get() . PHP_EOL; // 输出:10 / 2 = 5
} else {
// 尽管这里不会执行,但代码结构明确了失败的处理
echo "操作失败:" . $result1->getError()->getMessage() . PHP_EOL;
}
// 示例 2:失败的情况
$result2 = divide(5, 0);
if ($result2 instanceof Success) {
echo "5 / 0 = " . $result2->get() . PHP_EOL;
} else {
// 这里会执行,获取失败原因
echo "操作失败:" . $result2->getError()->getMessage() . PHP_EOL; // 输出:操作失败:除数不能为零!
// 也可以使用 getOr() 提供一个默认值,避免直接获取错误
echo "失败时使用默认值:" . $result2->getOr(0) . PHP_EOL; // 输出:失败时使用默认值:0
// 如果你确定是 Failure 且想直接获取错误,可以使用 getError()
$error = $result2->getError();
if ($error instanceof DivisionByZeroError) {
echo "捕获到 DivisionByZeroError: " . $error->getMessage() . PHP_EOL;
}
}
// 直接尝试获取失败结果的值会抛出 ResultException
// try {
// $result2->get();
// } catch (\Ghostwriter\Result\ResultException $e) {
// echo "尝试获取失败结果的值时抛出异常:" . $e->getMessage() . PHP_EOL;
// }优势与实际应用效果:
Result::success()
Result::failure()
return $value
return false
Failure
getOr()
get()
ResultInterface
null
false
总之,
ghostwriter/result
ghostwriter/result
以上就是告别PHP函数返回值混乱:如何使用ghostwriter/result优雅地处理成功与失败的详细内容,更多请关注php中文网其它相关文章!
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号