Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:include()错误,还是用户错误?(在IF语句中传递文件名)_Php_String_If Statement_Include - Fatal编程技术网

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

PHP:include()错误,还是用户错误?(在IF语句中传递文件名),php,string,if-statement,include,Php,String,If Statement,Include,好吧,我已经为此创建了一个PHP错误,但它被标记为伪造,但我不得不相信他们没有仔细阅读它 该错误是由于在IF语句中使用include()语句导致的,使该语句认为传递了空字符串 回顾bug将解释一切,包括测试脚本 这是一个bug,还是我遗漏了一些“特性”方面的东西?这很奇怪,因为如何将include的输出分配给一个变量,然后测试该值就可以了(这将是一个解决办法)。好吧,该报告说: 因为include()是一种特殊的语言构造,所以在其参数周围不需要括号。比较返回值时要小心 <?php //

好吧,我已经为此创建了一个PHP错误,但它被标记为伪造,但我不得不相信他们没有仔细阅读它

该错误是由于在
IF
语句中使用
include()
语句导致的,使该语句认为传递了空字符串

回顾bug将解释一切,包括测试脚本

这是一个bug,还是我遗漏了一些“特性”方面的东西?这很奇怪,因为如何将
include
的输出分配给一个变量,然后测试该值就可以了(这将是一个解决办法)。

好吧,该报告说:

因为
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';
}
?>

似乎实现它是为了将其作为后一种(类似于最长的匹配)进行interpet

同样的道理也适用于

$v = include('foo') . 'bar';
哪个PHP解释为

$v = include(('foo') . 'bar');
并尝试加载
foobar

但也给出了解决方案:将整个include语句包装到括号中,那么PHP解释调用的方法只有一种:

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

(可能)离题:您会在PHP的其他部分发现类似的“问题”。取变量:

$obj->$foo['bar'];
PHP不知道是否要访问数组
$foo
bar
元素并使用此值作为属性名:

$obj->{$foo['bar']};
或者,如果要访问
$obj->$foo
元素:

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

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

这种行为不能简单地改变,因为它可能会破坏依赖于这种行为的代码。

好吧,报告说:

因为
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';
}
?>

似乎实现它是为了将其作为后一种(类似于最长的匹配)进行interpet

同样的道理也适用于

$v = include('foo') . 'bar';
哪个PHP解释为

$v = include(('foo') . 'bar');
并尝试加载
foobar

但也给出了解决方案:将整个include语句包装到括号中,那么PHP解释调用的方法只有一种:

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

(可能)离题:您会在PHP的其他部分发现类似的“问题”。取变量:

$obj->$foo['bar'];
PHP不知道是否要访问数组
$foo
bar
元素并使用此值作为属性名:

$obj->{$foo['bar']};
或者,如果要访问
$obj->$foo
元素:

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

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


这种行为不能简单地改变,因为它可能会破坏依赖于这种行为的代码。

我不知道,只要我省略了比较,我就可以让它使用括号或不使用括号。如果我没有一个正确的路径,我会得到一个非常丑陋的警告。@Jared Farrish:是的,因为不需要写括号,这就是为什么如果在这行中有更多的运算符,它会表现得很奇怪。例如,
include('foo')。“bar”
尝试包含
foobar
,而不是将返回值与
bar
@Felix连接起来-我只是在想,您可能还可以添加一些示例来说明它是否有效。这是否意味着您可以将文件路径/名称设置为一个变量,并检查它是否与该变量和括号相匹配?@Jared Farrish:对不起,时间太晚了,我应该睡觉了;)@费利克斯-别担心,我认为你做得很好。答案不再是,总的来说,我认为你的答案有助于更好地理解。当然,这是我见过的一种更有趣的类似“bug”的行为。你提供了另一个更好的答案,所以我给了你一票。我认为OP应该把这标记为一个答案。我不知道,我能够让它在有括号或没有括号的情况下工作,只要我省略了比较。如果我没有一个正确的路径,我会得到一个非常丑陋的警告。@Jared Farrish:是的,因为不需要写括号,这就是为什么如果在这行中有更多的运算符,它会表现得很奇怪。例如,
include('foo')。“bar”
尝试包含
foobar
,而不是将返回值与
bar
@Felix连接起来-我只是在想,您可能还可以添加一些示例来说明它是否有效。这是否意味着您可以将文件路径/名称设置为一个变量,并检查它是否与该变量和括号相匹配?@Jared Farrish:对不起,时间太晚了,我应该睡觉了;)@费利克斯-别担心,我认为你做得很好。答案不再是,总的来说,我认为你的答案有助于更好地理解。当然,这是我见过的一种更有趣的类似“bug”的行为。你提供了另一个更好的答案,所以我给了你一票。我认为OP应该把这标记为一个答案。