你能在下面这行代码中找到多少可以改进的地方呢?
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') || 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 是一个语言结构,就像echo, 但是它只接受一个参数,这样,它需要使用级联或重复的调用print。
对的!对使用多参数的echo说“是”,对print和小括号说“不”!