分享一个 php 包,安全的使用内置函数方法:thecodingmachine/safe
前言
在 PHP 的一些历史遗留设计中,许多函数在出错或失败时会返回 false
、-1
或 null
等特殊值。如果你没有对这些返回值进行正确检查,就可能导致程序行为不符合预期。
举个例子
$content = file_get_contents('foobar.json');
$foobar = json_decode($content);
在这段代码中:
如果
foobar.json
不存在,file_get_contents()
会返回false
并触发一个 warning;json_decode()
接收到false
会返回null
;之后的代码仍会继续执行,错误很可能在后续某个环节才暴露出来,而不是在问题发生的当下就被发现。
如果希望更加严谨地处理这些情况,就需要显式地进行错误检查:
$content = file_get_contents('foobar.json');
if ($content === false) {
throw new FileLoadingException('Could not load file foobar.json');
}
$foobar = json_decode($content);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new FileLoadingException('foobar.json does not contain valid JSON: ' . json_last_error_msg());
}
通过在每一步中主动检测错误并抛出异常,可以让你在问题出现的第一时间就得到提示,而不是等到后续某个异常行为发生后再去排查源头。
更好的方案
推荐使用这个包:thecodingmachine/safe。它对 PHP 的一些内置函数进行了包装,让这些函数在出错时抛出异常,而不是返回 false
。
使用方式如下:
use function Safe\file_get_contents;
use function Safe\json_decode;
$content = file_get_contents('foobar.json');
$foobar = json_decode($content);
这段代码的行为现在和前面手动处理异常的代码效果一致:一旦发生错误,就会立刻抛出异常,阻止程序继续运行。同时,代码也更加简洁、易读。
更进一步
使用 PHPStan 检查
该包还提供了 PHPStan 的扩展功能,它可以帮助你分析代码中是否使用了未安全包装的内置函数,并建议你使用对应的安全版本,从而避免未来产生不安全调用。
使用 Rector 自动替换
此外,它也提供了针对 Rector 的规则,可以自动替换你代码中对原生函数的调用为安全版本。
⚠️ 注意:Rector 仅负责函数替换,并不会检查你是否已经手动进行过错误处理。因此,仍需结合代码审查和测试使用。
写在最后
如果你对其实现方式感兴趣,建议查阅其源码与文档,评估该库是否适合你的项目。
参考链接
本文使用 ChatGPT 进行了排版优化、专有名词处理、错别字、错误用词处理。
本作品采用 知识共享署名 4.0 国际许可协议 进行许可。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: