php打印构造在哪个方向执行
我在php.net中遇到了一个例子。这是统计数据php打印构造在哪个方向执行,php,Php,我在php.net中遇到了一个例子。这是统计数据 echo 3 . print(2) . print(4) . 5 . 'c' . print(6) . print(7). 'b' .print(8) . 'a'; 它打印8a7b16145c12131。但是如何打印呢?它打印“8”与“a”连接,依此类推,如手册所示,从右到左。echo打印出“1” 范例 <?php echo print(8) . 'a'; ?> 打印8a1我想你只是被连接运算符的存在愚弄了,它让
echo 3 . print(2) . print(4) . 5 . 'c' .
print(6) . print(7). 'b' .print(8) . 'a';
它打印
8a7b16145c12131
。但是如何打印呢?它打印“8”与“a”连接,依此类推,如手册所示,从右到左。echo打印出“1”
范例
<?php
echo print(8) . 'a';
?>
打印8a1我想你只是被连接运算符
的存在愚弄了,它让你假设这个代码的唯一输出来自echo
,而所有其他函数只会“贡献”echo的参数。当然,这是错误的,因为您假设print()
以某种方式改变了它的行为,在那里返回其输出,而不是立即(在调用时)将其打印到输出流。唯一可以连接的是字符串和每个print()
的**返回值**。而后者总是“1”。将print()
更改为sprintf()
,所有的“魔力”都将消失
顺便说一句,这是一个好主意-可以保持忙碌一段时间:)
根据OP的请求进行编辑
这里的“罪魁祸首”是print
。值得注意的是,它不是一个真正的函数,而是影响评估过程中处理它的方式的语言结构。例如:
echo 3 . print(2) . 'c';
产生:
2c31
但如果将打印移动到如下函数中:
function x($a) { return print $a; }
echo 3 . x(2) . 'c';
然后,输出将看起来更正常:
231c
如果您关心细节,则需要潜入Zend引擎源代码,但一般来说,这种语法可能用于任何有用的内容。记住print
就足够了
为什么我们会看到“231c”?这是因为echo
参数首先需要求值,否则PHP实际上不知道要回送什么(或者可以部分地知道)。因此,PHP大致是这样:
- 将“3”添加到我们的临时字符串
- 调用函数
x(2)
-由于此函数不打印
,我们的参数(“2”)将立即打印到输出。函数返回“1”,因为print
总是返回“1”(参见手册),所以PHP将“1”连接到“31”
获取“c”并连接,现在我们有了“31c”
echo
我们的临时字符串李>
请注意,实际上echo
仅输出'31c'。之所以有前缀“2”,是因为它是print
output,并且我们没有同时使用LF(或者
,如果您没有在控制台中进行测试),所以所有输出都进入一行。如果将代码更改为使用LF(或
):
那么输出将是:
2
31c
希望这能有所帮助。链接到手册,而不是只在半空中留下一句话,这会有所帮助:-另外,应该注意的是,“答案”实际上是手册页上的一条评论。是的,答案在手册中的注释中,我没有给出手册的链接,因为问卷给了他同样的答案。你能用简单的语言解释一下吗,实际上我是PHP的新手。
2
31c