当前位置: 首页 > 面试题库 >

如何避免isset()和empty()

邓令
2023-03-14
问题内容

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

我正在考虑通过它们使它们与E_NOTICE兼容,因为有关丢失变量或偏移量的通知可能会节省生命,可能会获得一些较小的性能改进,并且总体而言,这是一种更清洁的方法。

但是,我不喜欢什么造成数百isset() empty()array_key_exists()S
^确实给我的代码。它变得肿,可读性降低,而没有获得任何价值或意义。

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


问题答案:

恕我直言,您不仅应该考虑使应用程序“与E_NOTICE兼容”,还应该对整个事情进行重组。在您的代码中有 数百个
点经常尝试使用不存在的变量听起来像一个结构很差的程序。尝试访问不存在的变量永远不会发生,其他语言编译时会对此表示沮丧。PHP允许您这样做的事实并不意味着您应该这样做。

这些警告可以 帮助 您,而不会惹恼您。如果收到警告 “您正在尝试使用不存在的东西!” ,您的反应应该是 “糟糕,我的糟糕,让我尽快解决该问题。”
您还如何区分 “在未定义的范围内有效的变量”可能导致严重错误的诚实错误代码 之间的区别?这也是为什么您始终 _总是_将错误报告转为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);

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

在其余情况下,假设您要在模板中输出可能由控制器设置或可能未设置的值,则只需检查以下内容:

<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

如上所述,但是,如果您正确初始化变量,则无需检查键是否存在,因为您知道它确实存在。如果您收到来自外部源的阵列,该值将最有可能不是null,但是''0'0'false或类似的东西,也就是一个值,你可以用评估isset或者empty,这取决于你的意图。如果您定期将数组键设置为,null并希望它的含义不是false,即在上例中,如果程序逻辑的不同结果issetarray_key_exists不同之处,您应该问自己为什么。仅仅存在一个变量并不重要,只有其值才有意义。如果键是true/
false标志,则使用true或者false,不是null。唯一的例外是希望null表示某些含义的第三方库,但是由于null很难在PHP中检测到,因此我尚未找到任何可以做到这一点的库。



 类似资料:
  • 问题内容: 我正在尝试通过从客户端向服务器发送密钥和随机数来认证用户。 我的代码未向我显示客户端的响应。执行下面的代码时,我得到了一个空指针异常。 问题答案: 解决大多数问题的固定步骤: 阅读堆栈跟踪以确定哪一行代码引发NPE 在该行代码处设置一个断点 使用调试器,在遇到断点时,确定该行中的对象引用是 弄清楚为什么引用该文件(到目前为止,这是唯一实际的困难部分) 解决根本原因(也可能很困难)

  • 问题内容: 我有两个简单的Java代码。第一个将恒定功率定义为power = a.pow(b); 第二个将恒定功率定义为power = BigInteger.ONE.shiftLeft(b) 在命令行中设置内存标志- Xmx1024m,第一个代码可以正常工作,但是第二个代码却出现错误:java.lang.OutOfMemoryError:Java堆空间 我的问题:我应该在第二个代码中更改什么以避免

  • 问题内容: 我有一个用于将文本添加到现有.doc文件中的代码,它将通过使用apache POI将其另存为另一个名称。 以下是到目前为止我尝试过的代码 以下是我得到的 我已经添加了与此对应的所有jar文件,但仍然找不到解决方案。我对apache poi是陌生的,所以请帮我提供一些解释和示例。谢谢 问题答案: 从我对问题的评论中复制: 看起来您需要Apache POI发行版中的poi-ooxml-sc

  • 问题内容: 这看起来很丑。可选选项的优点在这里完全消失了。我读到应该使用或代替。但是,如果我更换每个吸气剂,真的有好处吗? 与 您知道这里的一些常见或最佳做法吗? 问题答案: 您可以使用 关键是仅在可选函数不为空时才评估映射函数,否则结果将保留为空。如果可选为空,将返回。

  • 问题内容: 要避免很多。 有没有好的替代方法? 例如: 当不知道对象是否存在时,可以避免使用。 问题答案: 在我看来,这似乎是一个相当普遍的问题,初级和中级开发人员往往会在某个时候遇到这些问题:他们要么不知道,要么不信任他们所参与的合同,并且防御性地检查了null。另外,在编写自己的代码时,他们倾向于依靠返回空值来表示某些内容,因此要求调用者检查空值。 换句话说,在两种情况下会出现空检查: 如果为

  • 问题内容: 我可以在不生成编译的.pyc文件的情况下运行python解释器吗? 问题答案: 来自“ Python 2.6的新增功能- 解释器更改” : 现在,可以通过向Python解释器提供-B开关,或者通过在运行解释器之前设置 PYTHONDONTWRITEBYTECODE环境变量来阻止Python编写.pyc或.pyo文件。此设置可作为Python程序的 变量使用,并且Python代码可以更改