先上大神文章54chen
里面提到了echo 字符串用,
比用.
连接要好。原因先不说,先来看以下两句
<?php
// 逗号比.更节省时间?
echo '1+5=' . 1+5;
echo '1+5=' . 5+1;
结果是什么?
1+5=6?
1+5=6?
——————
6?
2?
——————
6.6?
6.6?
——————
我只能说echo '5+1=' . 1+5;
的结果是10,所以结果是6
和2
.
<?php
// Strings can either be passed individually as multiple arguments or
// concatenated together and passed as a single argument
echo 'This ', 'string ', 'was ', 'made ', 'with multiple parameters.', chr(10);
echo 'This ' . 'string ' . 'was ' . 'made ' . 'with concatenation.' . "\n";
至于为啥快,可以简单理解,用.是先拼接在echo,虽然逗号个数代表echo的调用次数(可以这么理解暂时)。
但是拼接的速度要小于echo的速度。
如果深入理解,VLD如下图。是@tywei大神的图
上面比下面多了个CONCAT,下面比上面多了个echo。
如果想知道更多详细信息,点击查看这个重磅炸弹
=======更新分割线===================2016-05-27
今天在看java的时候,发现java的string对象很严谨,小例子如下
public class HelloWorld {
public static void main(String[] args) {
String s1 = "imooc";
String s2 = "imooc";
String s3="I love "+s1;
//定义字符串s3,保存“I love”和s1拼接后的内容
// 比较字符串s1和s2
// imooc为常量字符串,多次出现时会被编译器优化,只创建一个对象
System.out.println("s1和s2内存地址相同吗?" + (s1 == s2));
//比较字符串s1和s3
System.out.println("s1和s3内存地址相同吗?" + (s2==s3) );
String s4 = "I love " + s1;
//比较字符串s4和s3
// s1是变量,s4在运行时才知道具体值,所以s3和s4是不同的对象
System.out.println("s3和s4内存地址相同吗?" + (s4 == s3));
}
}
以上的结果为
s1和s2内存地址相同吗?true
s1和s3内存地址相同吗?false
s3和s4内存地址相同吗?false
暂不讨论内存地址这个概念(其实我不大懂),我就想起了php中是不是也是这样。
类似例子就不贴了,php肯定是全等的。。但是我又想到了怎么看php中内存具体怎么调用,想到了c下的gdb。但是php还是解析不了。那先看看opcode,然后就有这篇补上的文章了。
我们先安装个vld扩展,先声明我环境为14.04 LTS PHP 5.5.9-1ubuntu4.16 (cli)
pecl下载vld
tar zxvf
解压
进入到解压好目录
phpize
./configure
make && make install
(注意操作要在root下,要不会报perssion错误)
root@tb:/home/tb/Downloads/vld-0.13.0# ls /usr/lib/php5/20121212/
json.so memcached.so mysql.so pdo_mysql.so readline.so vld.so
mcrypt.so mysqli.so opcache.so pdo.so redis.so xhprof.so
这样就装好了。
====修改fpm下的配置文件
vim /etc/php5/fpm/php.ini
增加一行vld
的,如下所示
[redis]
extension =redis.so
[xhprof]
extension=xhprof.so
[vld]
extension=vld.so
xhprof.output_dir=/var/log/xhprof
[memcache]
extension =memcached.so
重启fpm
service php5-fpm stop
service php5-fpm start
可以看到web中的phpinfo有了vld的选项。
vld support enabled
为啥说是web中呢,因为我们一般调试在cli端
所以需要修改下cli
的php.ini
文件
执行php -m |grep vld
root@tb:/usr/share/nginx/html/vldtest# php -m |grep vld
vld
就说明cli下的vld也可以用了。
然后我们在具体目录建两个php文件,内容如下
root@tb:/usr/share/nginx/html/vldtest# cat 1.php
<?php
echo "hello"." "."world";?>
root@tb:/usr/share/nginx/html/vldtest# cat 2.php
<?php
echo "hello"," ","world";?>
root@tb:/usr/share/nginx/html/vldtest#
然后分别执行
php -dvld.active=1 1.php
root@tb:/usr/share/nginx/html/vldtest# php -dvld.active=1 1.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename: /usr/share/nginx/html/vldtest/1.php
function name: (null)
number of ops: 4
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > CONCAT ~0 'hello', '+'
1 CONCAT ~1 ~0, 'world'
2 ECHO ~1
3 3 > RETURN 1
branch: # 0; line: 2- 3; sop: 0; eop: 3; out1: -2
path #1: 0,
hello world
php -dvld.active=1 2.php
root@tb:/usr/share/nginx/html/vldtest# php -dvld.active=1 2.php
Finding entry points
Branch analysis from position: 0
Jump found. Position 1 = -2
filename: /usr/share/nginx/html/vldtest/2.php
function name: (null)
number of ops: 4
compiled vars: none
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------------------
2 0 E > ECHO 'hello'
1 ECHO '+'
2 ECHO 'world'
3 3 > RETURN 1
branch: # 0; line: 2- 3; sop: 0; eop: 3; out1: -2
path #1: 0,
hello world
下面简单记录下参数意义:
-dvld.active 是否再执行时激活vld,默认为0.所以我们都使用-dvld.active=1启用
-dvld.skip_prepend 是否跳过php.ini配置文件中auto_prepend_file指定的文件,默认为0,就是禁用。
就是不跳过
-dvld.execute 是否执行php脚本,默认为1,所以上面都显示了helloworld
-dvld.save_paths 指定是否输出文件
再膜拜下大神关于vld的文章
另外感兴趣的同学关于扩展可以执行下 php --re vld【redis,memcache】
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。