php - 如何避免isset()和empty()

标签 php error-reporting

我有几个较旧的应用程序在 E_NOTICE 错误级别上运行时会抛出大量“xyz 未定义”和“未定义偏移”消息,因为未使用 isset() 显式检查变量的存在。和配偶。

我正在考虑通过它们使它们与 E_NOTICE 兼容,因为有关缺少变量或偏移量的通知可以挽救生命,可能会获得一些小的性能改进,并且总体上是更清洁的方式。

但是,我不喜欢造成数百个 isset() 的事情。 empty()array_key_exists() s 对我的代码。它变得臃肿,变得不那么可读,没有获得任何值(value)或意义。

如何在不进行过多变量检查的情况下构建我的代码,同时还与 E_NOTICE 兼容?

最佳答案

对于有兴趣的人,我已将此主题扩展为一篇小文章,以更好的结构形式提供以下信息:The Definitive Guide To PHP's isset And empty

恕我直言,您不仅应该考虑使应用程序“兼容 E_NOTICE”,还应该考虑重构整个过程。在您的代码中有数百个经常尝试使用不存在的变量的点听起来像是一个结构相当糟糕的程序。尝试访问不存在的变量永远不应该发生,其他语言在编译时对此犹豫不决。 PHP 允许您这样做的事实并不意味着您应该这样做。

这些警告是为了帮助您,而不是为了惹恼您。如果您收到警告“您正在尝试使用不存在的东西!”,您的 react 应该是“糟糕,我的错,让我尽快修复它。”您还能如何区分“未定义的工作正常的变量”和 之间的区别老实说可能导致严重错误的错误代码 ?这也是为什么你总是,总是,开发错误报告的原因 turned to 11并继续插入您的代码,直到没有一个 NOTICE发出。关闭错误报告仅适用于生产环境,以避免信息泄漏并提供更好的用户体验,即使面对有错误的代码。

详细说明:

您将永远需要 issetempty在您的代码中的某个地方,减少它们出现的唯一方法是正确初始化您的变量。根据情况有不同的方法来做到这一点:

函数参数:

function foo ($bar, $baz = null) { ... }

无需检查 $bar$baz在函数内部设置,因为您只是设置它们,您需要担心的是它们的值是否计算为 truefalse (或其他任何东西)。

任何地方的常规变量:
$foo = null;
$bar = $baz = 'default value';

在将要使用它们的代码块的顶部初始化变量。这解决了!isset问题,确保你的变量总是有一个已知的默认值,让读者了解下面的代码将用于什么,从而也可以作为一种自我文档。

数组:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);

与上述相同,您使用默认值初始化数组并用实际值覆盖它们。

在其余情况下,假设您输出的值可能由 Controller 设置,也可能不由 Controller 设置,您只需要检查:
<table>
    <?php if (!empty($foo) && is_array($foo)) : ?>
        <?php foreach ($foo as $bar) : ?>
            <tr>...</tr>
        <?php endforeach; ?>
    <?php else : ?>
        <tr><td>No Foo!</td></tr>
    <?php endif; ?>
</table>

如果您发现自己经常使用 array_key_exists ,您应该评估您使用它的目的。唯一不同的地方是在这里:
$array = array('key' => null);
isset($array['key']); // false
array_key_exists('key', $array); // true

如上所述,如果您正确初始化了变量,则无需检查 key 是否存在,因为您知道它确实存在。如果您从外部来源获取数组,则该值很可能不是 null但是 '' , 0 , '0' , false或类似的东西,即您可以使用 isset 评估的值或 empty ,取决于您的意图。如果您定期将数组键设置为 null并希望它的意思不是 false , 即如果在上面的例子中 isset 的不同结果和 array_key_exists对您的程序逻辑产生影响,您应该问自己为什么。变量的存在不重要,重要的是它的值。如果 key 是 true/false标志,然后使用 truefalse , 不是 null .唯一的异常(exception)是需要 null 的第 3 方库。意味着什么,但因为 null在 PHP 中很难检测到我还没有找到任何可以做到这一点的库。

关于php - 如何避免isset()和empty(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960509/

相关文章:

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - 如何在PHP项目中找到未使用的函数

php - nodeJS + Socket.IO 和 PHP 如何集成?

php - MYSQL ERROR 1452 外键约束失败

.NET "Send error report to [me]"

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?

php - 启用 error_reporting 后,Mongo 将不会加载 phpinfo

php - 通过可迭代注入(inject)的标记服务中的类名获取服务

php + mysql 两表排序

php - mysqli_fetch_assoc()需要参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?