我有几个较旧的应用程序,它们在E_NOTICE错误级别上运行时会抛出很多“
xyz未定义”和“未定义偏移”消息,因为没有使用isset()
和明确检查变量的存在。
我正在考虑通过它们使它们与E_NOTICE兼容,因为有关丢失变量或偏移量的通知可能会节省生命,可能会获得一些较小的性能改进,并且总体而言,这是一种更清洁的方法。
但是,我不喜欢什么造成数百isset()
empty()
和array_key_exists()
S
^确实给我的代码。它变得肿,可读性降低,而没有获得任何价值或意义。
如何在不进行过多变量检查的情况下构造代码,同时又能与E_NOTICE兼容?
恕我直言,您不仅应该考虑使应用程序“与E_NOTICE兼容”,还应该对整个事情进行重组。在您的代码中有 数百个
点经常尝试使用不存在的变量听起来像一个结构很差的程序。尝试访问不存在的变量永远不会发生,其他语言在编译时会对此表示沮丧。PHP允许您这样做的事实并不意味着您应该这样做。
这些警告可以 帮助 您,而不会惹恼您。如果收到警告 “您正在尝试使用不存在的东西!” ,您的反应应该是 “糟糕,我的糟糕,让我尽快解决该问题。”
您还如何区分 “在未定义的范围内有效的变量” 和 可能导致严重错误的诚实错误代码 之间的区别?这也是为什么您始终 _总是_将错误报告转为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);
与上述相同,您正在使用默认值初始化数组,并使用实际值覆盖它们。
在其余情况下,假设您要在模板中输出可能由控制器设置或可能未设置的值,则只需检查以下内容:
<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
,即在上例中,如果程序逻辑的不同结果isset
和array_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代码可以更改