好吧所以我已经创建了一个PHP错误,但它被标记为虚假,但我不禁要相信他们没有仔细阅读...
错误是由include()
语句中的IF
语句引起的,使语句认为它已被传递为空字符串。
查看错误将解释所有内容,包括测试脚本。
这是一个错误,还是我错过了某些“功能”-wise?这很奇怪看到如何将include
的输出分配给变量,然后然后测试该值是否正常(这将是解决方法)。
答案 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
在所有这些情况下,解析器都有默认行为。开发商决定了一种可能性,因为他们必须这样做。它可能不是你所期望的,但如果你知道,你可以处理它。
此行为不能简单地更改,因为它可能会破坏依赖此行为的代码。