为什么这有效:
for ($i = 0; $i < 10; print $i++);
这会产生语法错误:
for ($i = 0; $i < 10; echo $i++);
有什么区别?两者都是语言结构。 什么是有效的,什么不是有规则?
答案 0 :(得分:2)
你是对的,echo
和print
都是语言结构,但是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
不起作用的原因)。