- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
PHP的print
有什么区别和 echo
?
Stack Overflow 上有很多关于 PHP 的问题 print
和 echo
关键字用法。
这篇文章的目的是提供一个规范的 reference PHP的问答print
和 echo
关键字并比较它们的差异和用例。
最佳答案
为什么是两个构造?
关于打印和 echo 的真相是,虽然它们在用户看来是两个不同的结构,但如果您深入了解基础,即查看内部源代码,它们实际上都是 echo 的阴影。该源代码涉及解析器以及操作码处理程序。考虑一个简单的操作,例如显示数字零。无论您使用 echo 还是 print,都将调用相同的处理程序“ZEND_ECHO_SPEC_CONST_HANDLER”。 print 处理程序在调用 echo 处理程序之前会做一件事,它确保 print 的返回值为 1,如下所示:
ZVAL_LONG(&EX_T(opline->result.var).tmp_var, 1);
echo expr, expr, ... expr
是一个语句,而
print expr
是一个表达式,因为它的计算结果是一个值。因此,与其他语句一样,
echo expr
独立存在,不能包含在表达式中:
5 + echo 6; // syntax error
print expr
,可以单独形成一个语句:
print 5; // valid
$x = (5 + print 5); // 5
var_dump( $x ); // 6
print
视为一元运算符,例如
!
或
~
但它不是运算符。
!, ~ and print
的共同点是它们都内置在 PHP 中,并且每个都只接受一个参数。您可以使用
print
创建以下奇怪但有效的代码:
<?php
print print print print 7; // 7111
line # * op fetch ext return operands
---------------------------------------------------------------------------------
3 0 > PRINT ~0 7
1 PRINT ~1 ~0
2 PRINT ~2 ~1
3 PRINT ~3 ~2
4 FREE ~3
5 > RETURN 1
print
返回一个值而
echo
没有?
2 + 3
的计算结果为
5
,而
abs(-10)
的计算结果为
10
。由于
print expr
本身就是一个表达式,那么它应该保存一个值并且确实如此,
1
的一致值表示一个真实的结果,并且通过返回一个非零值,该表达式对于包含在另一个表达式中变得有用。例如,在此代码段中,print 的返回值可用于确定函数序列:
<?php
function bar( $baz ) {
// other code
}
function foo() {
return print("In and out ...\n");
}
if ( foo() ) {
bar();
}
<?php
$haystack = 'abcde';
$needle = 'f';
strpos($haystack,$needle) !== FALSE OR print "$needle not in $haystack";
// output: f not in abcde
1;
,PHP 继承自 C 的语法。 表达式语句可能看起来很奇怪,但它非常有用,可以传递参数到功能。
print
是一个函数吗?
print (expr)
是一个表达式,尽管它看起来好像在使用函数调用语法。事实上,这些括号是括号表达式语法,对表达式求值很有用。这说明了这样一个事实:如果表达式很简单,例如
print "Hello, world!"
,它们有时是可选的。对于更复杂的表达式,例如
print (5 ** 2 + 6/2); // 28
,括号有助于表达式的计算。与函数名不同,
print
is syntactically a keyword 和语义上的 a
"language construct" 。
isset
或
empty
。尽管这些“构造”看起来和函数一模一样,但它们实际上是
fexprs ,即参数传递给它们而不进行评估,这需要编译器进行特殊处理。
print
恰好是一个 fexpr,它选择以与函数相同的方式评估其参数。
get_defined_functions()
可以看出区别:没有列出
print
函数。 (虽然
printf
和 friend 是:与
print
不同,它们是真正的函数。)
echo(foo)
工作相同的原因。这些括号与函数调用括号有很大不同,因为它们与表达式有关。这就是为什么可以编写
echo ( 5 + 8 )
并期望显示 13 的结果(请参阅
reference )。这些括号涉及评估表达式而不是调用函数。注意:PHP 中的括号还有其他用途,例如 if 条件表达式、赋值列表、函数声明等。
print(1,2,3)
和
echo(1,2,3)
会导致语法错误?
print expr
、
echo expr
或
echo expr, expr, ..., expr
。当 PHP 遇到
(1,2,3)
时,它尝试将其解析为单个表达式并失败,因为与 C 不同,PHP 并没有真正的二进制逗号运算符;逗号更多地用作分隔符。 (你可能会在 PHP 的 for 循环中找到一个二进制逗号,它继承自 C 的语法。)
echo e1, e2, ..., eN;
语句可以理解为
echo e1; echo e2; ...; echo eN;
的语法糖。
echo e
总是和
print e
有同样的副作用,而且
print e
的返回值在用作语句时会被忽略,所以我们可以将
echo e
理解为
print e
的语法糖。
echo e1, e2, ..., eN;
可以被视为
print e1; print e2; ... print eN;
的语法糖。 (但是,请注意下面的非语义运行时差异。)
print
的语义。
print e
,评估时:
e
和 type-casts 评估为字符串 s
的结果值。 (因此, print e
等价于 print (string) e
。)s
流式传输到 the output buffer(最终将流式传输到标准输出)。 1
。 print
涉及填充返回变量(伪代码)的小开销
print 125;
PRINT 125,$temp ; print 125 and place 1 in $temp
UNSET $temp ; remove $temp
echo
编译为一个操作码:
echo 125;
ECHO 125
echo
编译为多个操作码
echo 123, 456;
ECHO 123
ECHO 456
echo
不会连接其参数,而是将它们一一输出。
zend_do_print
,
zend_do_echo
。
ZEND_PRINT
实现如下(伪代码)
PRINT var, result:
result = 1
ECHO var
1
放在结果变量中,并将真正的工作委托(delegate)给
ZEND_ECHO
处理程序。
ZEND_ECHO
执行以下操作
ECHO var:
if var is object
temp = var->toString()
zend_print_variable(temp)
else
zend_print_variable(var)
zend_print_variable()
执行实际的“打印”(实际上,它只是重定向到专用的 SAPI 函数)。
echo x
与
print x
echo a,b,c
与
echo a.b.c
a.b.c.
,打印结果并立即处理它。由于串联涉及内存分配和复制,第一个选项将更有效。
<?=
,它是
echo
的别名,因此在代码的其他部分也坚持使用
echo
似乎是合乎逻辑的。
echo
有一个额外的优势,即能够打印多个表达式而不连接它们,并且不涉及填充临时返回变量的开销。所以,使用
echo
。
关于php - 引用 : Comparing PHP's print and echo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7094118/
我在 JavaScript 文件中运行 PHP,例如...... var = '';). 我需要使用 JavaScript 来扫描字符串中的 PHP 定界符(打开和关闭 PHP 的 )。 我已经知道使
我希望能够做这样的事情: php --determine-oldest-supported-php-version test.php 并得到这个输出: 7.2 也就是说,php 二进制检查 test.
我正在开发一个目前不使用任何框架的大型 php 站点。我的大问题是,随着时间的推移慢慢尝试将框架融入应用程序是否可取,例如在创建的新部件和更新的旧部件中? 比如所有的页面都是直接通过url服务的,有几
下面是我的源代码,我想在同一页面顶部的另一个 php 脚本中使用位于底部 php 脚本的变量 $r1。我需要一个简单的解决方案来解决这个问题。我想在代码中存在的更新查询中使用该变量。 $name)
我正在制作一个网站,根据不同的情况进行大量 PHP 重定向。就像这样...... header("Location: somesite.com/redirectedpage.php"); 为了安全起见
我有一个旧网站,我的 php 标签从 因为短标签已经显示出安全问题,并且在未来的版本中将不被支持。 关于php - 如何避免在 php 文件中写入
我有一个用 PHP 编写的配置文件,如下所示, 所以我想用PHP开发一个接口(interface),它可以编辑文件值,如$WEBPATH , $ACCOUNTPATH和 const值(value)观
我试图制作一个登录页面来学习基本的PHP,首先我希望我的独立PHP文件存储HTML文件的输入(带有表单),但是当我按下按钮时(触发POST到PHP脚本) )我一直收到令人不愉快的错误。 我已经搜索了S
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: What is the max key size for an array in PHP? 正如标题所说,我想知道
我正在寻找一种让 PHP 以一种形式打印任意数组的方法,我可以将该数组作为赋值包含在我的(测试)代码中。 print_r 产生例如: Array ( [0] => qsr-part:1285 [1]
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我在 MySQL 数据库中有一个表,其中存储餐厅在每个工作日和时段提供的菜单。 表结构如下: i_type i_name i_cost i_day i_start i_
我有两页。 test1.php 和 test2.php。 我想做的就是在 test1.php 上点击提交,并将 test2.php 显示在 div 中。这实际上工作正常,但我需要向 test2.php
我得到了这个代码。我想通过textarea更新mysql。我在textarea中回显我的MySQL,但我不知道如何更新它,我应该把所有东西都放进去吗,因为_GET模式没有给我任何东西,我也尝试_GET
首先,我是 php 的新手,所以我仍在努力学习。我在 Wordpress 上创建了一个表单,我想将值插入一个表(data_test 表,我已经管理了),然后从 data_test 表中获取所有列(id
我有以下函数可以清理用户或网址的输入: function SanitizeString($var) { $var=stripslashes($var); $va
我有一个 html 页面,它使用 php 文件查询数据库,然后让用户登录,否则拒绝访问。我遇到的问题是它只是重定向到 php 文件的 url,并且从不对发生的事情提供反馈。这是我第一次使用 html、
我有一个页面充满了指向 pdf 的链接,我想跟踪哪些链接被单击。我以为我可以做如下的事情,但遇到了问题: query($sql); if($result){
我正在使用 从外部文本文件加载 HTML/PHP 代码 $f = fopen($filename, "r"); while ($line = fgets($f, 4096)) { print $l
我是一名优秀的程序员,十分优秀!