PHP開(kāi)發(fā)中的坑

一润脸、md5和sha1的0e...的問(wèn)題

$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 是弱類型語(yǔ)言奋岁,在使用 == 號(hào)時(shí)塔猾,如果比較一個(gè)數(shù)字和字符串或者比較涉及到數(shù)字內(nèi)容的字符串鸦采,則字符串會(huì)被轉(zhuǎn)換為數(shù)值并且比較按照數(shù)值來(lái)進(jìn)行宾巍;兩個(gè)字符串恰好以 0e 的科學(xué)記數(shù)法開(kāi)頭,字符串被隱式轉(zhuǎn)換為浮點(diǎn)數(shù)渔伯,實(shí)際上也就等效于 0×10^0 顶霞,因此比較起來(lái)是相等的

解決方案

PHP中的Hash校驗(yàn),應(yīng)該使用===锣吼,而不應(yīng)該使用==选浑。另外如果生產(chǎn)環(huán)境版本足夠高的話(PHP >= 5.6.0),最好使用 hash_equals() 函數(shù)玄叠。

二古徒、數(shù)組返回null的函數(shù)

error_reporting(0);

error_reporting(0);

$arr = [];

var_dump(trim($arr) === null); //true

var_dump(md5($arr) === null); //true

var_dump(explode(',', $arr) === null); //true

var_dump(strpos($arr, 'a')); //NULL  查找字符串首次出現(xiàn)的位置

var_dump(strcmp($arr, 'a')); //NULL  二進(jìn)制安全字符串比較

三、foreach的引用與賦值

$test=array('a','b','c');
foreach($test as &$value){
    echo $value.'<br>';
}
echo $value.'<br>';

foreach($test as $value){
    echo $value.'<br>';
}
echo $value;
解釋

在第一個(gè)foreach中诸典,我們使用了賦值引用符號(hào)描函,它的意思是每次遍歷時(shí),value指向的是test數(shù)組中的對(duì)應(yīng)元素的地址狐粱,循環(huán)第一次時(shí)舀寓,value指向的是'a'的地址,第二次循環(huán)的時(shí)候肌蜻,value指向的是第二個(gè)元素'b'的地址互墓, 第三次循環(huán)時(shí),value指向的就是'c'的地址蒋搜。當(dāng)我們?cè)谧龅诙伪闅v的時(shí)候篡撵,其實(shí)value變量指向的還是test的第三個(gè)元素即'c'的地址。然后foreach本身的操作是把數(shù)組中對(duì)應(yīng)的元素賦值給as后面的變量豆挽,所以在第二個(gè)foreach中育谬, 遍歷第一次的時(shí)候,把'a'賦值給value指向的地址(&test[2])帮哈,原有'c'所占的地址空間的值變?yōu)榱?a',即['a','b','a']膛檀, 第二次遍歷的時(shí)候,把'b'賦值給value指向的地址即['a','b','b'], 第三次遍歷的時(shí)候咖刃,就把'b'賦值給$value指向的地址,最終結(jié)果['a','b','b']的原因泳炉。

解決方案

在使用完賦值引用操作符之后,把變量unset掉嚎杨,上例中加上unset(value)語(yǔ)句花鹅,相當(dāng)于取消value對(duì)該地址的引用,這樣第二次foreach的時(shí)候枫浙,$value相當(dāng)于新的變量刨肃,不會(huì)導(dǎo)致上述問(wèn)題。這也是一個(gè)很好的編程習(xí)慣自脯。

四之景、精度問(wèn)題

var_dump((0.1 + 0.7) === 0.8);//boolean false
var_dump((0.1 + 0.7) * 10 === 0.8 * 10);//boolean false
var_dump((0.1 + 0.7) * 100 === 0.8 * 100);//boolean true
echo intval(0.58 * 100);//57
echo intval(0.58 * 1000);//580


PHP浮點(diǎn)數(shù)的一個(gè)常見(jiàn)問(wèn)題的解答

解釋

不要用浮點(diǎn)數(shù)進(jìn)行比較和數(shù)學(xué)運(yùn)算轉(zhuǎn)化為整型運(yùn)算

解決方案

試用bcmath庫(kù)(php自帶)

四斤富、整型溢出

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

解釋

PHP的整型數(shù)的字長(zhǎng)和平臺(tái)有關(guān)膏潮,對(duì)于32位的操作系統(tǒng)抱怔,最大的整型是2147483647(2^31)屈扎,最小為 -2^31椿息∏劝眩可以表示4294967296個(gè)數(shù)字,有符號(hào)的話就是-2147483647到2147483648

解決方案

php里的辦法就是:不能使用intval,用floatval取代之莺治。
a = 21474836470; 看上去是整數(shù)悯舟,實(shí)際是浮點(diǎn)數(shù)窖贤;a = floatval(21474836470 ) 確保是一個(gè)數(shù)字

五勺择、優(yōu)先級(jí)

echo -10%3; // -1

因?yàn)?的優(yōu)先級(jí)比%求余的優(yōu)先級(jí)低潦嘶,也就是-(10%3)涩嚣。

ini_set('display_errors',0);
$arr = array(1=>1,3=>3);
$i = 2;
$a = 'test' . isset($arr[$i]) ? $arr[$i] : $i; //null

因"."的優(yōu)先級(jí)高于三元運(yùn)算符"?:"。所以程序其實(shí)報(bào)錯(cuò)了掂僵。會(huì)說(shuō)$arr的索引2不存在航厚。

$a = 3;
$b = 5;
if($a = 5 || $b = 7) {
    $a++;
    $b++;
}
echo $a . " " . $b;  // 1 6

因"="的優(yōu)先級(jí)低于"||",所以先邏輯判斷再賦值锰蓬。也就是(a = (5 ||b = 7))幔睬。所以,最后其實(shí)給a賦值true了芹扭,$a等于1.

$x = 2;
echo $x == 2 ? '我' : $x == 1 ? '你' : '它'; //你

因?yàn)?== 的優(yōu)先級(jí)比三元運(yùn)算符高

$x = 2;//將2賦值給變量x 
echo true ? '我' : false ? '你' : '它';
//由于三元運(yùn)算符左結(jié)合的特性 所以如上代碼等效于
echo (true ? '我' : false) ? '你' : '它';
//先計(jì)算左邊括號(hào)里的
echo '我' ? '你' : '它';

因"=="的優(yōu)先級(jí)高于"?:"

六麻顶、include

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

因include()也是一個(gè)函數(shù),有返回值舱卡。在成功時(shí)返回1辅肾,失敗時(shí)返回錯(cuò)誤信息。如果被包含的文件有return轮锥,則inculde()成功時(shí)返回該文件的返回值矫钓。

七、static和++

<?php
$count = 5;
function get_count() {
    static $count = 0;
    return $count++;
}
++$count;
echo $count; //6
echo get_count(); //0
echo get_count(); //1
?>

因static count,所以只在第一次調(diào)用get_count的時(shí)候?qū)? mathimg=count賦值為0份汗,第二次再進(jìn)來(lái)這個(gè)函數(shù)盈电,則不會(huì)第二次賦值。其次就是return count++和return ++count了杯活,前者先返回匆帚,后者先++再返回。

八旁钧、類型轉(zhuǎn)換

<?php
$arr = array(0 =>1,'aa' => 2,3,4);
foreach($arr as $key => $val){
    print($key == 'aa' ? 5 : $val);
}
//5534
?>

因遍歷數(shù)組第一次的時(shí)候吸重,$key和aa的比較實(shí)際就是0和aa的比較,一個(gè)是int一個(gè)是string歪今,這個(gè)時(shí)候會(huì)轉(zhuǎn)換類型嚎幸,將字符串轉(zhuǎn)換為數(shù)字再與數(shù)字比較。所以0=='aa'就是0==0寄猩,所以為true嫉晶,也就是輸出5。

九田篇、count的用法

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

如果不是數(shù)組或者對(duì)象的其他類型替废,返回1.那么這個(gè)值應(yīng)該就是1+0+1了

十、++和&

<?php

$arr = array(1,2,3);
foreach($arr as &$val) {
    echo $val % 2; //1,0,1
    $val += $val % 2 ? $val++ : $val--;
}
print_r($arr);
$val = 0;
print(join('',$arr));

//101Array ( [0] => 3 [1] => 3 [2] => 7 ) 330
?>

因foreach結(jié)束后的數(shù)組應(yīng)該是array(3,3,7);最后給第三個(gè)元素賦值為0泊柬,所以就是330了椎镣。其中注意的是&,如果有&則是對(duì)原變量操作兽赁,如果沒(méi)有状答,則是先生成一個(gè)新變量,然后給這個(gè)變量復(fù)制刀崖,最后操作的是這個(gè)新變量惊科。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蒲跨,隨后出現(xiàn)的幾起案子译断,更是在濱河造成了極大的恐慌,老刑警劉巖或悲,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孙咪,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡巡语,警方通過(guò)查閱死者的電腦和手機(jī)翎蹈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)男公,“玉大人荤堪,你說(shuō)我怎么就攤上這事合陵。” “怎么了澄阳?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵拥知,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我碎赢,道長(zhǎng)低剔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任肮塞,我火速辦了婚禮襟齿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枕赵。我一直安慰自己猜欺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布拷窜。 她就那樣靜靜地躺著开皿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪装黑。 梳的紋絲不亂的頭發(fā)上副瀑,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音恋谭,去河邊找鬼。 笑死挽鞠,一個(gè)胖子當(dāng)著我的面吹牛疚颊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播信认,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼材义,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嫁赏?” 一聲冷哼從身側(cè)響起其掂,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎潦蝇,沒(méi)想到半個(gè)月后款熬,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攘乒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年贤牛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片则酝。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡殉簸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情般卑,我是刑警寧澤武鲁,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站蝠检,受9級(jí)特大地震影響洞坑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝇率,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一迟杂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧本慕,春花似錦排拷、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至藤违,卻和暖如春浪腐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背顿乒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工议街, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人璧榄。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓特漩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親骨杂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涂身,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 一、php可以做什么 php是一種可以在服務(wù)器端運(yùn)行的編程語(yǔ)言搓蚪,可以運(yùn)行在Web服務(wù)器端蛤售。 php是一門(mén)后臺(tái)編程語(yǔ)...
    空谷悠閱讀 3,098評(píng)論 4 97
  • Lua 5.1 參考手冊(cè) by Roberto Ierusalimschy, Luiz Henrique de F...
    蘇黎九歌閱讀 13,812評(píng)論 0 38
  • 一、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,746評(píng)論 0 10
  • 《裕語(yǔ)言》速成開(kāi)發(fā)手冊(cè)3.0 官方用戶交流:iApp開(kāi)發(fā)交流(1) 239547050iApp開(kāi)發(fā)交流(2) 10...
    葉染柒丶閱讀 26,837評(píng)論 5 19
  • 在中國(guó)當(dāng)大領(lǐng)導(dǎo)真難:必須懂權(quán)衡妒潭,要不然很難穩(wěn)定悴能,正反倆派才能維持穩(wěn)定,但這種穩(wěn)定往往阻礙創(chuàng)新杜耙,阻礙變革搜骡,沒(méi)有變革就...
    54f70f613c7c閱讀 180評(píng)論 1 2