为什么这是有效的:
for ($i = 0; $i < 10; print $i++);
这给出了语法错误:
for ($i = 0; $i < 10; echo $i++);
有什么不同?两者都是语言结构。是否有规则什么是有效的,什么是无效的?
为什么这是有效的:
for ($i = 0; $i < 10; print $i++);
这给出了语法错误:
for ($i = 0; $i < 10; echo $i++);
有什么不同?两者都是语言结构。是否有规则什么是有效的,什么是无效的?
你是对的,两者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
。