- 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/
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: template pass by value or const reference or…? 以下对于将函数
我用相同的参数列表重载了一个运算符两次。但返回类型不同: T& operator()(par_list){blablabla} const T& operator()(par_list){bla
假设我有实现接口(interface) I 的 Activity A。我的 ViewModel 类 (VM) 持有对实现接口(interface) I 的对象的引用: class A extends
PHP 如何解释 &$this ?为什么允许? 我遇到了以下问题,这看起来像是 PHP 7.1 和 7.2 中的错误。它与 &$this 引用和跨命名空间调用以及 call_user_func_arr
谁能解释一下下面“&”的作用: class TEST { } $abc =& new TEST(); 我知道这是引用。但是有人可以说明我为什么以及什么时候需要这样的东西吗?或者给我指向一个对此有很好解
引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。 C++ 引用 vs 指针 引用很容易与指针混淆,它们之间有三
目录 引言 背景 结论 引言 我选择写C++中的引用是因为我感觉大多数人误解了引用。而我之所以有这个感受是因为我主持过很多C++的面试,并且我很少
Perl 中的引用是指一个标量类型可以指向变量、数组、哈希表(也叫关联数组)甚至函数,可以应用在程序的任何地方 创建引用 定义变量的时候,在变量名前面加个 \,就得到了这个变量的一个引用 $sc
我编写了一个将从主脚本加载的 Perl 模块。该模块使用在主脚本中定义的子程序(我不是维护者)。 对于主脚本中的一个子例程,需要扩展,但我不想修补主脚本。相反,我想覆盖我的模块中的函数并保存对原始子例
我花了几个小时试图掌握 F# Quotations,但我遇到了一些障碍。我的要求是从可区分的联合类型中取出简单的函数(只是整数、+、-、/、*)并生成一个表达式树,最终将用于生成 C 代码。我知道使用
很多时候,问题(尤其是那些标记为 regex 的问题)询问验证密码的方法。似乎用户通常会寻求密码验证方法,包括确保密码包含特定字符、匹配特定模式和/或遵守最少字符数。这篇文章旨在帮助用户找到合适的密码
我想通过 MIN 函数内的地址(例如,C800)引用包含文本的最后一个单元格。你能帮忙吗? Sub Set_Formula() ' ----------------------------- Dim
使用常规的 for 循环,我可以做类似的事情: for (let i = 0; i < objects.length; i++) { delete objects[i]; } 常规的 for-
在 Cucumber 中,您定义了定义 BDD 语法的步骤;例如,您的测试可能有: When I navigate to step 3 然后你可以定义一个步骤: When /^I navigate t
这是什么UnaryExpression的目的,以及应该怎样使用? 最佳答案 它需要一个 Expression对象并用另一个 Expression 包裹它.例如,如果您有一个用于 lambda 的表达式
给出以下内容 $("#identifier div:first, #idetifier2").fadeOut(300,function() { // I need to reference jus
我不知道我要找的东西的正确术语,但我要找的是一个完整的引用,可以放在双引号之间的语句,比如 *, node()、@* 以及所有列出的 here加上任何其他存在的。 我链接到的答案提供了一些细节,但还
This question's answers are a community effort。编辑现有答案以改善此职位。它当前不接受新的答案或互动。 这是什么? 这是常见问答的集合。这也是一个社区Wi
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
考虑下一个代码: fn get_ref(slice: &'a Vec, f: fn(&'a Vec) -> R) -> R where R: 'a, { f(slice) } fn m
我是一名优秀的程序员,十分优秀!