您的位置 首页 php

你所不知道的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天。所以说这个事不能这么干。

文章来源:智云一二三科技

文章标题:你所不知道的php编程中那些坑~

文章地址:https://www.zhihuclub.com/152226.shtml

关于作者: 智云科技

热门文章

评论已关闭

7条评论

  1. In contrast to blood vessels present in normal tissues, the neovasculature generated by carcinoma cells is tortuous, prone to leakiness, and in a state of continuous reconfiguration

  2. Ford Yes, it often is more aggressive and deadly and not every case, but that s why I think there s a particular need for developing better therapies for this triple negative group

  3. vilagra comprar corega barato The goal of our peaceful mass rallies and peaceful sit ins in squares across Egypt is to force the coup plotters to reverse their action, Essam el Erian, a senior Brotherhood official, said on his Facebook page Wang W, Sindrewicz Goral P, Chen C, Duckworth CA, Pritchard DM, Rhodes JM, et al

  4. Spot on with this write-up, I really feel this site needs a great deal more attention. I’ll probably
    be returning to read through more, thanks for the advice!

网站地图