php打印构造在哪个方向执行

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我想你只是被连接运算符的存在愚弄了,它让

我在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
,而所有其他函数只会“贡献”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