你所不知道的php编程中那些坑~

PHP技术
355
0
0
2023-05-21
标签   PHP基础

1.另类的写法:

//异常写法
if(false == $result)
//正常写法
if($result == false)

其实这是一种很聪明的写法,它可以很大程度上杜绝手误造成的严重bug。 假如我们在正常方法中把 == 误写成 = ,那么if($result = false) 就会恒定返回true,导致在实际运行中产生未知的Bug,如果使用异常的写法出现手误变成时if(false = $false) ,编辑器会抛出一个error,我们就可以及时发现并修复问题。

2.运算符优先级:

if ($a = 100 && $b = 200) {
  var_dump($a, $b);
}

&&优先级大于=,所以按照法则是$a = (100 && $b) = 200,当然这不是你想要的,而实际执行起来也不是法则想要的。

3.精度丢失:

$f = 0.58;
echo intval($f * 100); // 输出57
sprintf("%.2f",$f * 100); //输出58.00

4. 字符串 的运算,你惹不起:

for ($i = 'a'; $i <= 'z'; ++$i) {
 echo "$i ";
}

你以为会输出从a到z?那你就错了,亮瞎你的输出结果如下:

a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad ae af
g ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bf
bg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cf
cg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de df
dg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee ef
eg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe ff
fg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gf
gg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hf
hg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie if
ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jf
jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kf
kg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lf
lg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mf
mg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nf
ng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe of
og oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pf
qg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rf
rg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sf
sg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tf
tg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue uf
ug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vf
vg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wf
wg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xf
xg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yf
yg yh yi yj yk yl ym yn yo yp yq yr ys yt yu yv yw yx yy yz

5.count的用法:

echo count (false); //1
$a = count ("567") + count(null) + count(false);
echo $a;//2

如果不是数组或者对象的其他类型,返回1.那么这个值应该就是1+0+1了

6. include

//file1.php
<?php
$a = '123';
?>
//file2.php
<?php
echo include('file1.php'); //1
?>

因include()也是一个函数,有返回值。在成功时返回1,失败时返回错误信息。如果被包含的文件有return,则inculde()成功时返回该文件的返回值。

7.整型溢出

$a = intval(21474836478);
var_dump($a);
$b = intval(2570);
$c = intval(21474839050);
var_dump($b === $c);

解释

解决方案

php里的办法就是:不能使用intval,用floatval取代之。a = 21474836470,看上去是整数,实际上是浮点数,a = floatval(21474836470 ) 确保是一个数字

8.md5和 sha1 的0e…的问题

$md5_1 = md5('240610708');
$md5_2 = md5('QNKCDZO');
var_dump($md5_1);
var_dump($md5_2);
var_dump($md5_1 == $md5_2);
$sha_1 = sha1('aaO8zKZF');
$sha_2 = sha1('aa3OFF9m');
 var_dump($sha_1);
 var_dump($sha_2);
var_dump($sha_1 == $sha_2);
var_dump('0x1234Ab' == '1193131');
var_dump( 0 == "a" ); //true
var_dump( "0" == "a" ); //false

解释

由于 PHP 是弱类型语言,在使用 == 号时,如果比较一个数字和字符串或者比较涉及到数字内容的字符串,则字符串会被转换为数值并且比较按照数值来进行;两个字符串恰好以 0e 的科学记数法开头,字符串被隐式转换为浮点数,实际上也就等效于 0×10^0 ,因此比较起来是相等的

解决方案

PHP中的Hash校验,应该使用===,而不应该使用==。另外如果生产环境版本足够高的话(PHP >= 5.6.0),最好使用 hash_equals() 函数。

9.switch/in_array等的松比较

<?php
$a = 0;
switch($a){
  case 'a':
    echo 'a';
  case 'b':
    echo 'b';
}
$arr = ['c','d'];
echo in_array($a,$arr) ? 'Yes' : 'No';

解决方案

对于switch做类型转换;in_array传入第三个参数true。

10.关于strtotime

$t = strtotime('2018-08-31');
echo date('Y-m-d',strtotime('-1 month',$t));//2017-07-31
echo '<br>';
echo date('Y-m-d',strtotime('-2 month',$t));//2017-07-01
$t = strtotime('2018-08-31');
echo date('Y-m-d',strtotime('-1 month',$t));//2017-07-31
echo '<br>';
echo date('Y-m-d',strtotime('-2 month',$t));//2017-07-01
实际上这也不算坑,因为6月没有31天。所以说这个事不能这么干。