ECHO在FOR LOOP的第三个exp中不起作用,但是PRINT确实有效吗?

时间:2013-10-15 08:36:41

标签: php loops for-loop language-construct

为什么这有效:

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

这会产生语法错误:

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

有什么区别?两者都是语言结构。 什么是有效的,什么不是有规则?

1 个答案:

答案 0 :(得分:2)

你是对的,echoprint都是语言结构,但是print的行为更像是一个功能而不是你意识到的。在内部,print被PHP视为函数,因为它总是返回一个值(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循环的上下文中使用。这种类型的语法仅对函数和方法有效(这就是print起作用而echo不起作用的原因)。