PHP:include()错误或用户错误? (在IF语句中传递文件名)

时间:2011-02-20 01:32:48

标签: php string if-statement include

好吧所以我已经创建了一个PHP错误,但它被标记为虚假,但我不禁要相信他们没有仔细阅读...

Link to Bug #54042

错误是由include()语句中的IF语句引起的,使语句认为它已被传递为空字符串。

查看错误将解释所有内容,包括测试脚本。

这是一个错误,还是我错过了某些“功能”-wise?这很奇怪看到如何将include的输出分配给变量,然后然后测试该值是否正常(这将是解决方法)。

1 个答案:

答案 0 :(得分:4)

嗯,documentation说:

  

因为include()是一种特殊的语言结构,所以在其参数周围不需要括号。比较返回值时要小心。

<?php
// won't work, evaluated as include(('vars.php') == 'OK'), i.e. include('')
if (include('vars.php') == 'OK') {
    echo 'OK';
}

// works
if ((include 'vars.php') == 'OK') {
    echo 'OK';
}
?>

所以这种行为已经知道并且不被视为错误。您甚至可以通过这种方式解释为什么

include不需要括号,因此PHP并不是真的要做:

include('vars.php') 

include(('vars.php') == 'OK')

似乎它被实施为将后者作为后者(类似于最长的匹配)。

同样适用于

$v = include('foo') . 'bar';

PHP将其解释为

$v = include(('foo') . 'bar');

并尝试加载foobar

但是也给出了解决方案:将整个include语句包含在括号中,然后只有一种方式可以解释PHP的调用:

$v = (include ('foo')) . 'bar';

(也许)偏离主题:你会在PHP的其他部分找到类似的“问题”。采取变量变量:

$obj->$foo['bar'];

PHP不知道您是否要访问数组bar的{​​{1}}元素并将此值用作属性名称:

$foo

或者如果您想访问$obj->{$foo['bar']}; 的{​​{1}}元素:

bar

在所有这些情况下,解析器都有默认行为。开发商决定了一种可能性,因为他们必须这样做。它可能不是你所期望的,但如果你知道,你可以处理它。

此行为不能简单地更改,因为它可能会破坏依赖此行为的代码。