Php 未使用的foreach循环性能影响?

Php 未使用的foreach循环性能影响?,php,performance,loops,foreach,Php,Performance,Loops,Foreach,我有一个关于foreach循环的问题,关于我正在使用DOM研究的情景XML解析器(本质上,它在XML中寻找一些硬编码的值)。有人知道实际上没有被调用的foreach循环对系统性能的影响吗 仅供参考,我正在研究至少两种离散类型的XML文件,每种文件本身都有许多循环,我想使用相同的解析文件来研究每种文件 举个例子,它会看一棵有一个函数的树,然后看一棵有另一个函数的树。如果运行一个包含信息的.php文件来响应两者,但只是适当地选择一个或另一个,结果会是什么 例如,如果我调用foreach($foo a

我有一个关于foreach循环的问题,关于我正在使用DOM研究的情景XML解析器(本质上,它在XML中寻找一些硬编码的值)。有人知道实际上没有被调用的foreach循环对系统性能的影响吗

仅供参考,我正在研究至少两种离散类型的XML文件,每种文件本身都有许多循环,我想使用相同的解析文件来研究每种文件

举个例子,它会看一棵有一个函数的树,然后看一棵有另一个函数的树。如果运行一个包含信息的.php文件来响应两者,但只是适当地选择一个或另一个,结果会是什么

例如,如果我调用foreach($foo as$bar),但是没有$bar,那么在foreach循环中运行的代码会发生什么变化?我很确定它会输出一个错误(虽然这在报告端会被抑制),但是当PHP解析其中的代码时,它的性能会受到影响吗

我可能有点不清楚;我可能在某些地方使用了错误的术语,因此我将做一个总结:

涉及不存在的关联数组的foreach循环是否会影响性能

作为参考,我想做一些类似于本页清单2下的示例的事情:


如果“清单2”示例中的XML文件中没有任何书籍,那么会不会出现重大问题,或者PHP会很好地继续(对于我来说,一个非致命错误也算很好),或者性能会受到影响?

我对这种情况的理解是,它永远不会在
foreach()中真正发挥作用
用于执行目的的循环

但是,代码占用磁盘空间的实际字节将加载到内存中,以便在成功输入
foreach()

我个人在一个所有错误都会出现的环境中进行开发,这样我就可以确保我的代码对于生产来说是坚如磐石的

如果我需要一个数组或对象,那么我通常会实现:

// check for the existence of $foo and make sure it is loop-able
// being loop-able means $foo is either and array or object and contains at least one item/element
if((is_array($foo) || is_object($foo)) && count($foo) > 0)
{
    foreach($foo as $bar)
    {
    }
}

总的来说,你的问题/关注点与微优化一致,当你微优化时,没有人会赢。只要确保您的代码对未来的开发人员来说易于理解,并在必要时重新考虑即可。

“如果我调用foreach($foo作为$bar),但没有$bar”——这毫无意义<代码>$bar只有在foreach循环对数据进行操作时才会生效。你的意思可能是如果
$foo
是一个空数组。而且一如既往:你在这里关心的是“微优化”,即在99.999…99%的实际使用案例中根本不会产生任何相关差异。两种方法都要实现,衡量差异,并选择适合您的性能要求的方法。也许我应该更清楚地知道,我将实际使用关联数组。我不确定这有什么区别,如果有的话,但我有20/30个基于案例的foreach循环,也就是“foreach object as object=>requirement”。至于手动测试,我主要担心的是我不知道我的最终性能要求可能是什么,也没有足够的经验知道我的测试是真正严格的。我希望开发一些其他人可能在他们自己的服务器上使用的东西,这可能是非常不同的环境。如果您没有明确的性能要求,那么在其他限制条件下,性能可能是最好的。例如,通常提高性能会降低可维护性,为了边际性能改进而降低可维护性可能是不可取的(缺少需求);我们是在检查是否至少有一个$foo数组,还是应该检查是否有$bar项?伪代码:
如果($foo是一个至少有一个元素的数组),那么foreach($foo as$bar){}
是,在尝试循环之前,确保
$foo
中至少有一个项,这仅仅是为了避免错误。如果关闭错误报告,则可以完全避免看到错误,但在开发代码时绝对不建议这样做。在学习PHP时使用此代码剖析数组/对象:
echo'。print\r($foo,true)。“”啊,我现在看到了。早餐(和解释)对我理解代码的作用是惊人的。另外,我需要停止像英语老师一样思考数组。因此,如果我想递归地检查对象,我可以定义数组;例如,如果我有一个3元素(完全是任意的),我可以有如下内容: