PHP的一些注意事项

(1) PDOStatement::bindParam()PDOStatement::bindValue()

   这两个方法作用差不多,但是使用时建议用PDOStatement::bindValue()这两个方法的声明如下:

boolPDOStatement::bindValue (mixed$parameter , mixed$value [,int$data_type = PDO::PARAM_STR ] )

boolPDOStatement::bindParam (mixed$parameter , mixed&$variable [,int$data_type = PDO::PARAM_STR [,int$length [,mixed$driver_options ]]] )

可以看出bindParam方法的第二个参数是个引用,一不注意就用错了,特别是foreach循环里使用bindParam很容易出错。

(2)在php使用正则表达式时的一点注意

注意模式串的书写,例如:preg_match("/<buy_nick>test_nick</buy_nick>/",$content,$match);这样是匹配不到你需要的字符串的,因为模式串只会识别到“/<buy_nick>test_nick</”这个字符串,而后面"buy_nick>/"都识别不到,php会报一个警告,说第2个'/'后的'b'字符无法识别。模式串一般是用'/'包含起来,所以才会出现上面的问题。把'/'转义一下就可以解决这个问题了,即:preg_match("/<buy_nick>test_nick<\\/buy_nick>/",$content,$match);

还有一个更简单的方法:

preg_match("/<buy_nick>test_nick</buy_nick>/",$content,$match);

改成:

preg_match("#<buy_nick>test_nick</buy_nick>#",$content,$match);

虽然在php的模式串经常使用“/”作为起始符,其实用其他字符也可以的,例如“#”。

(3)filter_input (int$type ,string$variable_name [, int$filter = FILTER_DEFAULT [,mixed$options ]] )

这个函数不太好用,建议用$_GET,$_POST,$_SERVER等

(4)php代码结尾?>之后最好不要有空行,容易导致其他文件包含此文件后在输出时多了空行;或者代码结尾处不写?>

(5)数组相加和数组合并的区别

$arr = array("key"=>"value",1=>"a");
$arr2 = array("key"=>"value2",1=>"b");
var_export($arr+$arr2);
var_export(array_merge($arr,$arr2));

以上代码段的输出是:

array (
  'key' => 'value',
  1 => 'a',
)array (
  'key' => 'value2',
  0 => 'a',
  1 => 'b',
)

从输出结果可以看出,

使用“+”号运算符的数组相加:如果输入的数组中相同的字符串键名或者数字键名,都不会覆盖原来的值,并且忽略

使用array_merge函数:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面;

array_merge的另一个值得注意的地方是:如果数组是数字索引的,则键名会以连续方式重新索引。如下所示:

$arr = array("111"=>1,222=>2);
$arr2 = array("333"=>3,444=>4);
var_export(array_merge($arr,$arr2));

上面代码段的输出结果是:

array (
  0 => 1,
  1 => 2,
  2 => 3,
  3 => 4,
)

如结果所示,原来的键名“111”,222等都没有了,重新索引了!


(6)浮点数运算时建议用BCMATH扩展里的函数,BCMATH是一个支持任意精度的数学库。

BCMATH扩展里有以下常用的函数:

string bcadd ( string$left_operand ,string$right_operand [,int$scale ] ) --加法

string bcsub ( string$left_operand ,string$right_operand [,int$scale ] ) --减法

string bcmul ( string$left_operand ,string$right_operand [,int$scale ] ) --乘法

string bcdiv ( string$left_operand ,string$right_operand [,int$scale ] ) --除法

int bccomp ( string$left_operand ,string$right_operand [,int$scale ] )   --比较大小

BCMATH扩展的文档:http://www.php.net/manual/en/ref.bc.php


(7)使用strtotime()函数时需要注意传递的日期不能太大

例如

var_dump(strtotime("2021-11-12 00:00:00"));
var_dump(strtotime("2061-11-12 00:00:00"));

输出结果(32位环境):

int(1636646400)
bool(false)

为什么第二个转换失败了呢?首先先看strtotime()函数的定义:

int strtotime (string $time [, int $now ] )

可以看出返回值是int,32位的环境下int最大能表示为2147483647,而自 January 1 1970 00:00:00 GMT 起到2061-11-12 00:00:00的秒数已经超过php里int的表示范围了,所以返回false



你可能感兴趣的:(PHP)