2

我在php.net的打印手册中遇到了一个示例。那个统计。

   echo 3 . print(2) . print(4) . 5 . 'c' . 
   print(6) . print(7). 'b' .print(8) . 'a';

打印8a7b16145c12131。但是怎么做?

4

2 回答 2

3

我认为您只是被连接运算符的存在所愚弄,.这使您假设此代码的唯一输出将来自echo并且所有其他函数只会“有助于”回声的参数。当然,这是错误的,因为您假设以print()某种方式改变了它的行为并在那里返回其输出,而不是立即(在调用时)将其打印到输出流。您连接的唯一内容是字符串和每个print()** 返回值**。而后者,根据手册始终是“1”。Change print(), tosprintf()和所有的“魔法”都会消失。

顺便说一句,这是个好主意-可以忙一段时间:)

根据 OP 的要求进行编辑

这里的“罪魁祸首”是print。值得注意的是,它不是一个真正的函数,而是影响评估过程中处理方式的语言结构。例如:

echo 3 . print(2) . 'c';

产生:

2c31

但如果你print进入这样的功能:

function x($a) { return print $a; }
echo 3 . x(2) . 'c';

那么输出看起来会更理智:

231c

如果您关心细节,您将需要潜入 Zend Engine 源代码,但一般来说,这种语法可能用于任何有用的东西。记住print就够了。

为什么我们仍然看到“231c”?这是因为echo首先需要评估参数 - 否则 PHP 并不真正知道要回显什么(或可能部分知道)。所以 PHP 多/少这样:

  • 将“3”添加到我们的临时字符串
  • 调用函数x(2)- 因为这个函数print,我们的参数(“2”)将立即打印到输出。函数返回“1”,因为print总是返回“1”(参见手册)所以 PHP 将“1”连接到我们现在有“31”,
  • 得到'c'并连接,所以我们现在有“31c”
  • echo我们的临时字符串。

请注意,实际上echo仅输出“31c”。有前缀“2”是因为它是print输出,同时我们没有使用 LF(或者<br />如果你没有在控制台中测试它),所以所有输出都放在一行中。如果您将代码更改为使用 LF(或<br />):

function x($a) { return print $a; }
$f = 3 . x(2) . 'c';
echo "\n${f}";

那么输出将是:

2
31c

希望这可以帮助。

于 2012-09-17T17:29:52.147 回答
0

它打印'8'与'a'连接,依此类推,如手册所述,从右到左。并且 echo 打印出 '1'

例子

<?php
echo print(8) . 'a';
?>

打印 8a1

于 2012-09-17T17:24:16.830 回答