分享

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

 美好生活谷 2019-05-05

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); // 输出57sprintf('%.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 afg ah ai aj ak al am an ao ap aq ar as at au av aw ax ay az ba bb bc bd be bfbg bh bi bj bk bl bm bn bo bp bq br bs bt bu bv bw bx by bz ca cb cc cd ce cfcg ch ci cj ck cl cm cn co cp cq cr cs ct cu cv cw cx cy cz da db dc dd de dfdg dh di dj dk dl dm dn do dp dq dr ds dt du dv dw dx dy dz ea eb ec ed ee efeg eh ei ej ek el em en eo ep eq er es et eu ev ew ex ey ez fa fb fc fd fe fffg fh fi fj fk fl fm fn fo fp fq fr fs ft fu fv fw fx fy fz ga gb gc gd ge gfgg gh gi gj gk gl gm gn go gp gq gr gs gt gu gv gw gx gy gz ha hb hc hd he hfhg hh hi hj hk hl hm hn ho hp hq hr hs ht hu hv hw hx hy hz ia ib ic id ie ifig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb jc jd je jfjg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ka kb kc kd ke kfkg kh ki kj kk kl km kn ko kp kq kr ks kt ku kv kw kx ky kz la lb lc ld le lflg lh li lj lk ll lm ln lo lp lq lr ls lt lu lv lw lx ly lz ma mb mc md me mfmg mh mi mj mk ml mm mn mo mp mq mr ms mt mu mv mw mx my mz na nb nc nd ne nfng nh ni nj nk nl nm nn no np nq nr ns nt nu nv nw nx ny nz oa ob oc od oe ofog oh oi oj ok ol om on oo op oq or os ot ou ov ow ox oy oz pa pb pc pd pe pfqg qh qi qj qk ql qm qn qo qp qq qr qs qt qu qv qw qx qy qz ra rb rc rd re rfrg rh ri rj rk rl rm rn ro rp rq rr rs rt ru rv rw rx ry rz sa sb sc sd se sfsg sh si sj sk sl sm sn so sp sq sr ss st su sv sw sx sy sz ta tb tc td te tftg th ti tj tk tl tm tn to tp tq tr ts tt tu tv tw tx ty tz ua ub uc ud ue ufug uh ui uj uk ul um un uo up uq ur us ut uu uv uw ux uy uz va vb vc vd ve vfvg vh vi vj vk vl vm vn vo vp vq vr vs vt vu vv vw vx vy vz wa wb wc wd we wfwg wh wi wj wk wl wm wn wo wp wq wr ws wt wu wv ww wx wy wz xa xb xc xd xe xfxg xh xi xj xk xl xm xn xo xp xq xr xs xt xu xv xw xx xy xz ya yb yc yd ye yfyg 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<?phpecho 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的整型数的字长和平台有关,对于32位的操作系统,最大的整型是2147483647(2^31),最小为 -2^31。可以表示4294967296个数字,有符号的话就是-2147483647到2147483648

解决方案

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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多