分享一个 php 包,安全的使用内置函数方法:thecodingmachine/safe

前言

在 PHP 的一些历史遗留设计中,许多函数在出错或失败时会返回 false-1null 等特殊值。如果你没有对这些返回值进行正确检查,就可能导致程序行为不符合预期。

举个例子

$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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!