我在php.net的打印手册中遇到了一个示例。那个统计。
echo 3 . print(2) . print(4) . 5 . 'c' .
print(6) . print(7). 'b' .print(8) . 'a';
打印8a7b16145c12131
。但是怎么做?
我在php.net的打印手册中遇到了一个示例。那个统计。
echo 3 . print(2) . print(4) . 5 . 'c' .
print(6) . print(7). 'b' .print(8) . 'a';
打印8a7b16145c12131
。但是怎么做?
我认为您只是被连接运算符的存在所愚弄,.
这使您假设此代码的唯一输出将来自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 多/少这样:
x(2)
- 因为这个函数print
,我们的参数(“2”)将立即打印到输出。函数返回“1”,因为print
总是返回“1”(参见手册)所以 PHP 将“1”连接到我们现在有“31”,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
希望这可以帮助。
它打印'8'与'a'连接,依此类推,如手册所述,从右到左。并且 echo 打印出 '1'
例子
<?php
echo print(8) . 'a';
?>
打印 8a1