一润脸、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í),
test數(shù)組中的對(duì)應(yīng)元素的地址狐粱,循環(huán)第一次時(shí)舀寓,
value指向的是第二個(gè)元素'b'的地址互墓, 第三次循環(huán)時(shí),
value變量指向的還是
value指向的地址(&
value指向的地址即['a','b','b'], 第三次遍歷的時(shí)候咖刃,就把'b'賦值給$value指向的地址,最終結(jié)果['a','b','b']的原因泳炉。
解決方案
在使用完賦值引用操作符之后,把變量unset掉嚎杨,上例中加上unset(
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 = 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í)低于"||",所以先邏輯判斷再賦值锰蓬。也就是(
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賦值為0份汗,第二次再進(jìn)來(lái)這個(gè)函數(shù)盈电,則不會(huì)第二次賦值。其次就是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è)新變量惊科。