php編程時(shí)難免會(huì)遇到一些錯(cuò)誤,調(diào)試錯(cuò)誤雖然不是一門高深的學(xué)問但是有效的查找卻很重要。
基本策略應(yīng)遵循一下原則:
1)出現(xiàn)錯(cuò)誤,判斷錯(cuò)誤出現(xiàn)在那個(gè)環(huán)節(jié)。
2)判斷出錯(cuò)原因,估計(jì)錯(cuò)誤出現(xiàn)的位置
3)查找錯(cuò)誤根源
4)對(duì)錯(cuò)誤進(jìn)行修改,首先要先備份
,別弄的錯(cuò)誤越改越多。
5)對(duì)修改后的代碼進(jìn)行測(cè)試。
手段:
1)增加中間變量或者跟蹤變量。例如輸出一行代碼或者輸出一些相關(guān)變量來(lái)發(fā)現(xiàn)錯(cuò)誤根源;
2)注釋掉部分代碼 (排除法),當(dāng)無(wú)法測(cè)試出錯(cuò)誤根源的時(shí)候,就使用排除法
,先注釋掉一下代碼,然后運(yùn)行查看錯(cuò)誤是否依然存在。如果仍然存在則繼續(xù)注釋。
3)同過調(diào)試器來(lái)單步調(diào)試,這樣可以跟蹤整個(gè)程序的執(zhí)行過程。發(fā)現(xiàn)是否有些應(yīng)該被執(zhí)行的代碼沒有被執(zhí)行?;蛘咦兞抠x值錯(cuò)誤等各種導(dǎo)致錯(cuò)誤的原因。
常見錯(cuò)誤分享:
1。語(yǔ)法錯(cuò)誤:
1)缺少分號(hào)。
在編寫代碼的時(shí)候由于某個(gè)語(yǔ)句或者變量的結(jié)尾處沒有使用“;”,從而導(dǎo)致程序出錯(cuò);
Parse error:
syntax error, unexpected T_ECHO in D:testwwwrootbloglogin.php on
line 4
2)缺少單引號(hào)或者雙引號(hào)
Parse error:
syntax error, unexpected $end in D:testwwwrootbloglogin.php on
line 7
3)缺少關(guān)鍵字或者邏輯結(jié)構(gòu)
例如沒有寫while條件
Parse error:
syntax error, unexpected ';', expecting T_WHILE inD:testwwwrootbloglogin.php on
line 14
4)缺少括號(hào)
出錯(cuò)在程序的最后一行
而且其并沒有錯(cuò)誤,就很可能哪里缺少括號(hào)了
Parse error: syntax error,
unexpected ';' in D:testwwwrootbloglogin.php on
line 15
5)缺少美元符號(hào)$;
2.語(yǔ)義錯(cuò)誤
例如:
$e=$a+$b+$c;
而在php中的連接符是“.”而不是“+”,沒有得到預(yù)期的結(jié)果;
3.注釋錯(cuò)誤
對(duì)于程序來(lái)說注釋是很重要的,特別對(duì)后期的修改和維護(hù)更是至關(guān)重要。在程序中使用了錯(cuò)誤的注釋,雖然不會(huì)影響其運(yùn)行,但對(duì)修改產(chǎn)出影響
例如:
<?php
//循環(huán)出$i,從0到50
for($i=0;$i<50;$i++)
{
echo $i;
}
?>
運(yùn)行結(jié)果是01234。。。4849;但到后期維護(hù)時(shí)則認(rèn)為是錯(cuò)誤的 ,因?yàn)樽⑨尷锏氖堑?span>50,而實(shí)際是“大于等于0小于50的數(shù)字”
4.運(yùn)行錯(cuò)誤
如果運(yùn)行中出現(xiàn)錯(cuò)誤是個(gè)麻煩的事情,很難檢測(cè)到錯(cuò)誤出現(xiàn)在什么地方,同時(shí)也難以改正;
1)調(diào)用不存在的函數(shù) 例如你調(diào)用時(shí)把函數(shù)名寫錯(cuò)了
Parse
error: syntax error, unexpected T_VARIABLE, expecting ';'
inD:testwwwrootbloglogin.php on
line 15
或者沒有指定參數(shù) 例如
<?php
echo date();
//使用此函數(shù)得指定參數(shù);
?>
則得到告警:
Warning: date() expects at least 1
parameter, 0 given in D:testwwwrootbloglogin.phpon
line 9
2)讀寫文件
訪問文件的錯(cuò)誤也經(jīng)常出現(xiàn)
3)包含的文件不存在
<?php
include("abc.txt");
?>
告警:Warning:
include(abc.txt) [function.include]:
failed to open stream: No such file or directory in D:testwwwrootbloglogin.php on
line 2
Warning: include() [function.include]: Failed opening 'abc.txt' for inclusion (include_path='.;C:php5pear')
in D:testwwwrootbloglogin.php on
line 2
Warning: Cannot modify header
information - headers already sent by (output started at
D:testwwwrootbloglogin.php:2) in D:testwwwrootbloglogin.php on
line 3
4)運(yùn)算的錯(cuò)誤
如果出現(xiàn)不符合運(yùn)算規(guī)則則出現(xiàn)錯(cuò)誤:
<?php
$m=5;
$n=0;
$a=$m/$n; //0不能做除數(shù);
echo
$a;
?>
告警:
Warning:
Division by zero in D:testwwwrootbloglogin.php on
line 13
5.邏輯錯(cuò)誤
邏輯錯(cuò)誤時(shí)在語(yǔ)法上不存在的錯(cuò)誤,但是從程序的功能是看是BUG,她是嘴難調(diào)試和發(fā)現(xiàn)的BUG,因?yàn)樗粫?huì)拋出任何錯(cuò)誤信息。唯一能看到的是程序的功能沒有實(shí)現(xiàn)。對(duì)于邏輯錯(cuò)誤而言,發(fā)現(xiàn)時(shí)容易的,但查找原因卻很難。
例如:
<?php
$arr =
array("php","abc","adsf");
echo $arr[1];
?>
運(yùn)行結(jié)果為 abc;
但是開發(fā)者想輸出的是php,忽略了數(shù)組時(shí)從0開始計(jì)算的