PHP编码的几个最佳实践

继续说说PHP的几个编码优化

[b]1.用逗号连接echo字符串[/b]
$name='orange';
$address='BeiJing';
echo 'Hi,'.$name.'! Welcome to '.$address;//慢
echo 'Hi,',$name,'! Welcome to ',$address;//快,建议方式

原因可以查看两者的opcode,用逗号的方式和用点号方式的opcode如下
[img]http://dl.iteye.com/upload/attachment/0078/9309/098aa1b0-4f75-3fd0-8c19-9aee100ca515.png[/img]
[b]2.使用require还是require_once[/b]
老问题了,Lerdof N年前就提出来了,建议用require,因为require_once发起少量的stat调用,我们可以通过ab来测试一下效率
#a.php文件
require_once('ClassA.php');
require_once('ClassB.php');
require_once('ClassC.php');
echo 'end';

测试ab -c 10 -n 10000 http://localhost/orange/a.php 同时10个请求共请求10000次,结果如下:
[img]http://dl.iteye.com/upload/attachment/0078/9311/269342f3-92c1-3c11-9b6e-7601eb22ea68.png[/img]
#b.php文件
require('ClassA.php');
require('ClassB.php');
require('ClassC.php');
echo 'end';

同样测试测试ab -c 10 -n 10000 http://localhost/orange/b.php 同时10个请求共请求10000次,结果如下:
[img]http://dl.iteye.com/upload/attachment/0078/9313/45ab42f4-cd4a-3d87-bec9-a2751c8433c1.png[/img]
增加了近20的并发量!

[b]3.提前计算循环长度[/b]
如下代码
$items=array(0,1,2,3,4,5,6,7,8,9);
for($i=0;$i<count($items);$i++)
{
$temp=$items[$i]*$items[$i];
}

循环是如何执行的?
* $i初始化0,调用count($items)检测,平方;
* $i等于1,调用count($items)检测,平方;
* $i等于2,调用count($items)检测,平方;
* ...........................
count($items)执行了count($items)遍!所以我们提前计算循环长度,实验对比
#a.php文件
$start=microtime(true);
$items=array_fill(0,100000,'orange');
for($i=0;$i<count($items);$i++)
{
$temp=$items[$i].$items[$i];
}
echo microtime(true)-$start;

执行结果:
[img]http://dl.iteye.com/upload/attachment/0078/9315/65e0b962-27b4-3df6-a376-7b6270d92812.png[/img]
#b.php文件
$start=microtime(true);
$items=array_fill(0,100000,'orange');
$count=count($items);
for($i=0;$i<$count;$i++)
{
$temp=$items[$i].$items[$i];
}
echo microtime(true)-$start;

执行结果:
[img]http://dl.iteye.com/upload/attachment/0078/9317/b19cbd7f-4526-31c8-b904-2a1e658813af.png[/img]
[b]4.使用foreach、for、while循环数组[/b]
老问题了,不解释,在此就上一张表,看表后,你自己选择吧!
10万元素数组PHP循环执行平均时间
[table]
|foreach 0.0078毫秒|
|while 0.0099毫秒|
|for 0.0105毫秒|
[/table]
[b]5.勿要追求极致的面向对象[/b]
面向对象虽然有各种好处,但效率损失是个硬伤。
#a.php文件
/**
* 属性private,get/set齐全
*/
class Student{
private $name;
private $age;
public function setAge($age){
$this->age = $age;
}
public function getAge(){
return $this->age;
}
public function setName($name){
$this->name = $name;
}
public function getName(){
return $this->name;
}
}

$student=new Student();
$start=microtime(true);
for($i=0;$i<100000;$i++){
$student->setAge($i);
}
echo microtime(true)-$start;

执行时间
[img]http://dl.iteye.com/upload/attachment/0078/9326/f77056c1-f304-384f-8643-44ff9481fcc6.png[/img]
#b.php文件
/**
* 属性public,直接赋值属性
*/
class Student{
public $name;
public $age;
}
$student=new Student();
$start=microtime(true);
for($i=0;$i<100000;$i++){
$student->age=$i;
}
echo microtime(true)-$start;

[img]http://dl.iteye.com/upload/attachment/0078/9328/95649862-2e46-3899-a624-29c909282ff2.png[/img]
效率提升至3000%..............................
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值