0

为什么这是有效的:

for ($i = 0; $i < 10; print $i++);

这给出了语法错误:

for ($i = 0; $i < 10; echo $i++);

有什么不同?两者都是语言结构。是否有规则什么是有效的,什么是无效的?

4

1 回答 1

2

你是对的,两者echo都是print语言结构,但是print它的行为比你意识到的更像一个函数。在内部,printPHP 将其视为函数,因为它总是返回一个值 ( int 1)。

正是由于这个关键的区别,PHP 解释器允许在循环中调用这种特殊的语言结构for——因为它被视为print一个函数,因此,它可以在通常使用函数的上下文中使用。考虑以下代码

<?php (1 > 0) ? print 'true' : print 'false'; ?>

上面的代码可以工作,它会打印“true”。但是,请考虑以下事项:

<?php (1 > 0) ? echo 'true' : echo 'false'; ?>
<?php (1 > 0) ? return 'true' : yield 'false'; ?>
<?php (1 > 0) ? continue : break; ?>

这些例子都不是有效的,并且会抛出一个致命的解析错误警告。这是因为语言结构的处理方式有些晦涩(特别是print,它是如此特殊,以至于它的工作方式与所有其他结构不同),因为它们在某些情况下表现得像函数,但在其他情况下却大不相同。

考虑以下:

<?php

    function _echo($a)
    {
        echo $a;
    }

    (1 > 0) ? _echo('true') : _echo('false');

?>

这段代码可以工作,因为我们不再echo直接使用语言结构,而是为它创建了一个包装函数。这个函数将被执行,PHP 不再关心这个函数的内容是什么,或者我们在那里使用什么语言结构。

通常,不能在我的第二个示例的上下文或for循环的上下文中使用语言结构。这种类型的语法仅对函数和方法有效(这就是有效而无效的原因printecho

于 2013-10-15T09:06:38.967 回答