PHP效率开发--数组中的引号

 

PHP效率开发--数组中的引号

数组概述

       数组,作为一种简单的线性数据结构,在程序开发的过程中时常会被用到。PHP将数组分为两类:数值数组和关联数组。

       数值数组和大多数其它语言的使用方法一样:在一对中括号中加上一个数字表示要存取的值在数组中的存放位置。例如:$array[0] = ”value”。

       关联数组是PHP的一大亮点,它通过使用字符串来索引数组,例如在某个水果销售系统中,我们要为几种水果指定价格,于是我们可以这样写:$price[‘Apple’] = 1.8; $price[‘Banana’] = 4.6; $price[Pear] = 2.8; $price[Other] = 0.5; 。

 

问题出现

       从上面的例子可以看出关联数组使得我们的代码更加清晰,同时在很大程度上提高了开发效率。细心的可能会发现在我们举例关联数组时,前两个数组中(Apple和Banana)的字符串索引我们加上了单引号,而后面两个(Pear和Other)则没有!是的,为了提高开发效率,PHP允许我们在使用关联数组时不必给数组的索引字符串加上引号。这确实给我们带来了很大的方便:首先PHPer不必在每次写数组时都要记得加上烦人的引号;其次可以避免引号配对问题。不过这带来了另外的一个问题――性能。在接下来的文章中我们将通过例子来解释这个现象。

性能测试

性能和效率之间似乎总是呈反比的,有时为了效率我们必须牺牲性能,有时有不得不反过来,不过在这里我们应该选择哪个呢?先看下面的代码:

 


<?

       //定义一个存放临时数据的文件

       $fp=fopen('delete.txt','w');

       //初始化数组

       $array=array('name'=>'value');

       //定义循环次数

       $LOOPTIMES=100;

       //得到初始时间

       $t0=number_format(microtime(true),10,'.','');

       //循环显示没有使用引号的数组

       for($i=0;$i<$LOOPTIMES;$i++)

              fputs($fp,$array[name]);

       $t1=number_format(microtime(true),10,'.','');

       $rs1=$t1-$t0;

       //循环显示使用了引号的数组

       for($i=0;$i<$LOOPTIMES;$i++)

              fputs($fp,$array['name']);

       $t2=number_format(microtime(true),10,'.','');

       $rs2=$t2-$t1;

//     显示结果

       echo "$t1 - $t0 = ".$rs1." ";

       echo "$t2 - $t1 = ".$rs2." ";

       fclose($fp);

?>

 

上面的代码分别循环100次使用大引号的关联数组和不代引号的关联数组,最后输出它们所消耗的时间。下图显示了允许程序10次后的结果:

 


在10次的测试中,使用引号所花费的平均时间为0.003,而没使用引号的平均时间为0.032911,大约是前者的10倍!

总结

       从上的例子中可以看出:不使用引号的关联数组所带来的优点比较起来其,在关联数组中使用引号将使得程序的性能得到很大的提升。而且由于有了像Zend这样优秀的PHP集成开发环境,它不仅能为PHP字符串自动添加引号,而且配备了出色的代码检查功能。这使得我们更没有理由继续使用没有引号的关联数组。

 

 

 

 

更新:

一定要加引号,如果不加引号,则方括号中是一个常量,PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。
它能运行,是因为 PHP 自动将裸字符串(没有引号的字符串且不对应于任何已知符号)转换成一个其值为该裸字符串的正常字符串。
例如,如果没有常量定义为 anykey,PHP 将把它替代为 'anykey' 并使用之。
 

结果:$arr['a'] 的效率高于 $arr[a];

 

PHP安全基础

1、你的程序安全吗?
  1)有没有安全意识,平常编码习惯
  2)是否有被攻击或者注入

结论:安全是永恒的话题,没有绝对的安全,需要我们在平常的工作中养成良好的编码习惯和安全意识,需要不断的吸收最新的安全知识,并作相应的防范措施。

   就PHP来看,主要碰到的有几大类:
     1)服务器安全配置和PHP自身问题
     2)SQL注入
     3)XSS跨站脚本攻击
     4)编码安全意识

2、安全问题都是可以防范的,但是很难覆盖所有的方面,只要在平常编码中注意安全问题,才能较少甚至基本杜绝安全问题
2.1 服务器安全配置和PHP自身问题
    1)服务器自身漏洞和运行权限、共享权限(/tem/sess..)等
    2)目录浏览
    3)文件浏览、执行权限(gif89a)
    4)Cookie/Session暴露与会话劫持
    5)PHP的Register Globals
    6)系统函数/eval等和用户提交的数据
    7)数据过滤与输出(引号问题…)
    8)错误报告(生产环境一定要记得关闭)
    9)其它(文件包含-路径、来源判断、…)
2.2 SQL注入
    程序中最经常遇到的问题:
    1)“靠山靠”不住,摆脱依赖引号处理或魔术引号(magic_quotes_gpc)
    2)Mysql系统函数问题(其它的DBMS类似)
    3)避免在查询语句中使用“不可靠”数据
    4)数据类型预先处理
    5)使用mysql_real_escape_string或mysql_escape_string
2.3 XSS跨站脚本攻击
   跨站脚本攻击主要有2类:
    1)HTML/JS
    2)CSS(expression) – CSS中的Javascript
    攻击分类:
    1)来自内部的攻击,利用自身
    2)来自外部的攻击,外部JS、iframe等

   跨站攻击的危害其实也不小,简单的列一下它能做什么:
       得到web shell权限、帐号等隐私数据、挂马、弹广告等
3、如何防范?
    1)保护账号,避免弱口令(基本)
    2)服务器和PHP安全配置,并且要保持更新
    3)养成良好的安全编码意识,培养安全意识
    4)不要为了方便或者省时间留下安全隐患
    5)任何输入数据都是不可靠的,都需要经过处理
    6)输出页面时需要考虑是否有影响
    7)重要数据不要保存在客户端
    8)避免理所当然的精神,习惯误区
    9)经常检查、测试你的系统或者程序

   安全是永恒的话题,也是程序员必须面对的重要问题之一。
   此篇介绍的不是安全的全部,唯入门而已,主要是为大家开启安全之门。