---
title: "更好的PHP Echo"
url: https://www.exakat.io/%e6%9b%b4%e5%a5%bd%e7%9a%84php-echo/
date: 2015-06-29
modified: 2015-07-06
author: "David 戴炜"
description: "[caption id=\"attachment_599\" align=\"alignleft\" width=\"320\"] 更好的PHP Echo？ 使用这个简单的技巧，避免PHP在最后一刻使用更多的内存。[/caption] 你能在下面这行代码中找到多少可以改进的地方呢？ echo (\"this \".$will.\" be displayed.\"); Echo不需要小括号 首先，可能也是最明显的是那个无用的小括号。这个echo是一个“语言结构”(structure of language)，也叫做PHP一个特殊的函数：在包括其他的一些特点中，一个特点是它不需要任何的小括号。这个其实也适用于inclusions,return和print。上面的代码和下面的代码实现一样的目的： echo \"this \".$will.\" be displayed.\"; 在这里小括号没有任何功能上作用，但是即使是这两个多余的符号(tokens)也意味着对PHP来说一些额外的工作。它的冲击会在其他的一些不常见的情形下感觉到，比如: 小括号使用的地方会强制结果按值拷贝传递，而不是按指引传递，或者在echo的后面跟随这其他的操作符。 return (&$x); // 永远按值拷贝返回，而不会按指引 include('my_file.php') ||..."
categories:
  - "Company"
image: https://www.exakat.io/wp-content/uploads/2015/06/printer.320.jpg
word_count: 90
---

# 更好的PHP Echo

[![Better echo in PHP by replacing . by ,](http://178.62.231.40/wp-content/uploads/2015/03/printer.320.jpg)](http://178.62.231.40/wp-content/uploads/2015/03/printer.320.jpg)更好的PHP Echo？ 使用这个简单的技巧，避免PHP在最后一刻使用更多的内存。

你能在下面这行代码中找到多少可以改进的地方呢？
> **echo ("this ".$will." be displayed.");**

## Echo不需要小括号

首先，可能也是最明显的是那个无用的小括号。这个echo是一个“语言结构”(structure of language)，也叫做PHP一个特殊的函数：在包括其他的一些特点中，一个特点是它不需要任何的小括号。这个其实也适用于inclusions,return和print。上面的代码和下面的代码实现一样的目的：

echo "this ".$will." be displayed.";
在这里小括号没有任何功能上作用，但是即使是这两个多余的符号(tokens)也意味着对PHP来说一些额外的工作。它的冲击会在其他的一些不常见的情形下感觉到，比如: 小括号使用的地方会强制结果按值拷贝传递，而不是按指引传递，或者在echo的后面跟随这其他的操作符。
[return](http://php.net/manual/en/functions.returning-values.php) (&$x); // 永远按值拷贝返回，而不会按指引
include('my_file.php') || print("error loading"): // 总是会产生一个错误显示消息。
这个代码的主要效果会让读者觉得"echo"是某种类型的函数。这个是因为echo可以接受任何数量的参数。确实，下面是用小括号不可能实现的:
echo ($a, $b, $c); // 语法错误

echo $a, $b, $c; // 但这是可行的

## 没有必要做字符串级联(concatenation)

多参数的echo在PHP里很少使用，虽然这是一个可以使用更好的PHP echo的地方。级联在这个代码里其实是毫无用处的。PHP是如何处理这行代码的呢？
echo "this ".$will." be displayed.";
PHP看到echo所以它知道跟着的表达式是需要显示的，会要把它们发送到(标准)输出。然后，它看到了级联:为了处理它，PHP为这3个字符串分配必要的内存（这里，它的长度为4+strlen($will)+14)，然后从这些字符串和变量里拷贝它们的值到新分配的内存里。最后，它给整个一行的结果到echo。在一瞬间的时间，这行代码加倍了这个脚本需要的内存数，直到最后一刻。

相反的，当提供的字符串是分开的参数时，echo会即使的把它们送到输出，没有任何的额外内存开销。
echo "this ", $will, " be displayed.";
哦，还有这样的另外一个级联的版本也可以工作:
echo "this $will be displayed.";

## 比print更好的echo?

你可以很容易的通过使用多参数无级联的echo来节省内存的消耗。这个对于模板系统特别是这样，它们收集各处内容的片断，然后最后作为一个整体来输出它们；这个对于在最后一处加入一个新换行符的情况也是真的:
echo $message."\n"; // memory += strlen($message) + 1
这个也许是一个echo强于print的显著优点: [print](http://www.php.net/print) 是一个语言结构，就像echo, 但是它只接受一个参数，这样，它需要使用级联或重复的调用print。
对的！对使用多参数的echo说“是”，对print和小括号说“不”!

[![uk](http://178.62.231.40/wp-content/uploads/2015/06/uk.png) In English : Code expiration](http://178.62.231.40/better-echo-in-php/)