我有几个较旧的应用程序在 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
发出。关闭错误报告仅适用于生产环境,以避免信息泄漏并提供更好的用户体验,即使面对有错误的代码。
详细说明:
您将永远需要 isset
或 empty
在您的代码中的某个地方,减少它们出现的唯一方法是正确初始化您的变量。根据情况有不同的方法来做到这一点:
函数参数:
function foo ($bar, $baz = null) { ... }
无需检查
$bar
或 $baz
在函数内部设置,因为您只是设置它们,您需要担心的是它们的值是否计算为 true
或 false
(或其他任何东西)。任何地方的常规变量:
$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
标志,然后使用 true
或 false
, 不是 null
.唯一的异常(exception)是需要 null
的第 3 方库。意味着什么,但因为 null
在 PHP 中很难检测到我还没有找到任何可以做到这一点的库。
关于php - 如何避免isset()和empty(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960509/