《PHP实战》第一章 程序调试 [连载中...]
时间:2006-06-06
来源:互联网
[补充:假如因为不可抗力的因素,导致该书无法连载完毕,请诸位见谅,但是我会努力完成这个目标的]
[官方网站]http://blog.csdn.net/momodev/ 多多点广告哦,HOHO
第一章 php起航-程序调试
刚把序言发出去,默默就失眠了,因为突然想起来,居然连目录都还没想好,天啊,我明天肯定会被扁的很惨很惨的。
想了一晚,也没搞定,只好委屈各位看一章是一章了,毕竟,默默不太喜欢提前给自己指定条条框框,这样才不会限制我灵感的发挥,咳,默默其实是个很有条理的人,大家不用怀疑,今天我就把牙刷很笔直的放进了杯子里,呃,牙膏又忘记放了-_-,中午等着老妈再批我一顿吧。
OK,各位先生,各位小姐,我们伟大的航行就要起航了,请各位系好安全带,我们的目的地就是....暂时保密。(其实这个也没想好.-_-)
本书要讲的第一课就是如何调试PHP程序。
各位已经会调试的可以越过这一章,跟服务员要杯茶,买俩包子,去一边好好的聊聊吧。
各位还不会调试的,就听我好好的唠叨唠叨。
PHP调试是什么东西?这个问题说大可大说小可小,假如对一个项目调试那肯定就是很辛苦的工作了,为了避免刚开始就给新手泼冷水,我们先从简单的调试一步一步的讲一些技巧。
关于写PHP的东西,网上一直存在不少争议,虽然得到的结果都是一个.PHP后缀的文本文件。
我个人比较喜欢简洁,而且又比较懒,所以假如没有必要的话,我是很难会去主动学习一种新的东西,所以无论从学习PHP开始到目前为止,我写PHP主要还是在“记事本”上,我想熟悉WINDOWS操作的肯定都对这个不陌生吧,再怎么菜的小鸟们也肯定见过这东西,没错,打开就是一白板,想写什么就写什么。
我想看到这里,相当多的高手都会在心里暗想,这个作者真不专业呀,居然还在用那么小儿科的东西。
其实呢,按照默默的分析,记事本是一个很值得提倡的书写工具,虽然它没有代码提示等等花哨的功能,但是却是最容易使用,也是最容易获得的,因为这个东西就跟Linux的VI一样,在装机的时候就带上了,我想大部分在Linux奋战的PHPer肯定也有喜欢用VI的吧。
好了,我的看法就说到这里,至于说大家对其他的工具有偏好,也是理所应当,但是在这一章,我主要是从记事本方面讲调试。
写PHP程序的时候,只要新建一个记事本,将代码输入其中,然后保存为.php的文件,再放入apache的网站根目录之内就可以了。
也许有的新手在保存文件的时候会发现居然保存成了txt,要保存.php各位必须按如下步骤操作:
文件->另存为->文件名:xxxx.php 文件类型:所有文件
这样,一个php文件就诞生了,接下来就是调试,每个新手肯定都会遇到错误页面,有时候还十分恼火,的确,自己感觉上明明十分正确的程序为什么会出错呢,这无疑是对自己水平的一种否定,但是其实即便是再厉害的高手都必须要经过调试才能保证程序没有错误。
我们暂时先不谈如何调试,先从避免如何最大限度的减少调试次数说起。
我们知道,PHP的错误大致分以下几种:
第一种,边界错误:也就是有起始符没有结尾符,这是最容易犯的毛病,诸如写下面的代码
if($name="King"){
Echo "Hello,Mr.King";
}
我们大家一贯的思路是从上到下一点一点的输入,这也就造成我们也许会突然注意力分散,而少输入了最后的"}"
分析了不少高手的输入习惯之后,我总结出,要避免此类错误,首先要养成如下习惯就是写这段代码的时候先输入:
if($name="King"){
}
上面是第一步,也就是当你打算写一段代码块的时候,首先将{}一起输入。
然后再在"{}"中间输入
if($name="King"){
Echo "Hello,Mr.King";
}
这样会在最大限度上防止边界错误出现,所以说我们写PHP文件的时候首先要写如下代码
<?php
?>
然后再写里面的内容,好,边界错误的方法就讲到这里。
补充:不但是"}"还有")"也是大家经常会忘记的,比如:
if(empty($name) && empty($email))
很多朋友会少写最后的")"
要避免此类错误可以参考刚才的写法.首先把"()"写完
第二种错误:变量名错误。
PHP是大小写敏感的语言,也就是$Name和$name是两个不同的变量,即便是它们的意思虽然相同。
要避免这种错误出现其实很简单,那就是采用完全小写的编程方式来书写,虽然有不少的同学喜欢这样定义
$strName="默默";
但是我们可以看出,假如稍微一粗心,这个变量在引用的时候就会出现如下情况
Echo $strname;
我们即使不去调试也可以知道,这个程序不会输出$strName的值。但是我们的编译器并没有给你报错,这是一个隐性错误,假如忽略的话,以后肯定会让你大伤脑筋的。
完全采用小写是一种偷巧的方式,但是也是错误率会减少的不错方法。
第三种:";"错误,这个很多新手就不明白了,这是什么错误,其实这个错误是很容易的犯的。
这个错误其实跟第一种类似,也是缺少结束符号,但是这个结束符号往往是大家最容易遗忘的,除非养成习惯,否则很多时候你都会被莫名其妙的错误所困扰。
比如代码
haha(){
Echo "哈哈";
}
haha()
这段代码的作用是声明一个函数,并调用,关于此类概念新手可以暂时不用深究,但是我可以很认真的说,这是一段很典型的错误代码。
也许不少人第一眼还看不出来,但是老鸟们立即就抓住了要害,缺少";"
haha();
才是正确的写法。
这个新手会在以后的编程中遇到,提前给各位打打预防针。
第四种:下标越界,我想很多的朋友也会遇到此类错误的困扰。
我们很多朋友在写程序的时候会这么写
$arr=array(1,2,3,4,5);
Echo $arr[5];
假如我们不去考虑数组的下标约定,那么这段代码看起来好象没有错误,应该显示5,但是事实上,它并不会显示5。
为什么?这就要从数组的下标约定来说了,因为数组的下标第一个数字并非1而是0
所以获得数组的第5个元素并不能用$arr[5]来获得,而是$arr[4]
假如按我说的改正之后,程序立即就显示出了我们所预想的值。
第五种:输入错误,这是最频繁,也是最不容易避免的错误。
比如函数
urlencode()
这在php的函数里,名字也不算很长,但是假如我们一疏忽可能就写成了
ulrencode()
很明显,我们写错了,但是我们可能很难会立即发现,无奈最后PHP只好给我们一个无情的警告,让我们不得不再次翻开代码来找。
要避免这个错误出现,在编码中认真校对是一个很不错的习惯,也就是写完一个代码块,立即检查,而并非一连串的把程序全部都写完再去检查,肯定是要吃大亏的。
当然,输入错误并非只出现在函数,代码的任何地方都可能会出现,因此是颗名副其实的隐形炸弹。
一般的常见错误暂时就想起了这么多,欢迎各位补充,并提出自己在这方面的技巧和感言。
说完了避免,再说怎么面对,我们很多时候即便是很认真的想避免错误,但是百密一疏,只好硬着头皮去解决了。
假如程序给出了错误提示,那么无疑是降低了我们排除的难度。
但是,如果新手对php.ini的错误并没有做过设定,那么很多时候,出现错误,页面会一片空白。
你面对空白页面肯定是一脸茫然,什么错误都不给我,让我怎么去调试呀?其实呢,这不能怪PHP的解释器。
首先,PHP的错误提示是分等级的,而调试的时候我们需要把等级设定到最高,那么任何错误都会给出提示了。
要把PHP的错误等级调到最高,我们并不是只有去改php.ini这个途径可选,其实有一些设定,是可以在PHP程序里进行软修改的。
软修改这个词很贴切,其实也可以说是暂时修改,因为它的修改作用域只局限在它所包含的那个页面。
要让PHP提示全部都显示,我们可以在PHP的程序开头加入如下语句
error_reporting(E_ALL);
也就是
<?php
error_reporting(E_ALL);
?>
这样,那么程序的错误基本上就一目了然了。
但是有些新手还是犯嘀咕,我这么菜,就算给了我提示我也不知道怎么解决呀。
其实,很多时候PHP给出的错误并非完全正确的,这主要是我们在编码的时候不一定完全按照规范,而导致的错报,但是无论是错报还是实报,我们的程序肯定存在错误。
那么怎么来很好的排除这些错误呢。
要理解所有的错误提示的含义,对于英文不好的新手来说无疑是很困难的。
我们可以按照这个步骤来排除。
一般错误都会给出错误提示行,也就是 line x (x代表数字)
我们可以打开程序找到该行。
在记事本里查找行,首先确保你的“格式”->“自动换行”中没有对号,也就是没有选中。
然后,可以按ctrl+g来快速的查找行。
找到该行之后,只要你细心,一般是会很快的找出错误的根源,然后立即修正。
假如你怎么检查也发现该行完全没有错误,那么问题的关键肯定并非出现在该行,而是与该行有关联的那部分,你可以顺着这个线索去找。
其实我们的新手也许都有这个常识,但是更让他们头疼的是,即便是该行的确有错误,但是却不知道怎么解决。
是的,这才是最大的难点。
这个时候我们该怎么办呢,搜。
这个词很经典,没错,互联网的海量信息各位是有目共睹的,这也就是说,你所犯的错误,肯定在互联网上也有人遇到过,去找找他们的解决方案是一个不错的选择。
一般来说,搜索引擎不能只看准一个,无论是百度还是google都不能放过,
搜索也是一门学问,出现错误,一定要抓住错误的要点,不要太笼统的找,否则你肯定找不到需要的信息,除非你的运气真的很好。
搜索引擎是第一个选择,专业站则是第二个选择,在PHP的专业站进行搜索是你在搜索引擎没有得到答案之后要做的。
假如还是没有结果,那么你的错误基本上是不常见的,所以你只有到论坛里进行提问了。
提问更是一门艺术,我先把我个人的见解告诉一下大家。
首先,标题要切中要害,诸如“各位救救我吧”“跪求”“急死了,谁来帮帮我呀”之类的,虽然会起到一定的效果,但是会让不少的高手放弃去帮助你的念头。
所以标题必须要和内容一致,并且简明扼要。
而内容则是将错误提示和相关代码一并贴出。
假如运气足够好,那么不出半小时就会有回答,但是假如运气不好,即使一两天也是可能的,但是我想,只要你的问题是在大家的能力之内,很多人都会帮助你的。
接受帮助之后,千万不要忘记说声谢谢,这是最起码的尊重,也是我们必须要做的。
基本上,调试程序的方式就是上面所讲,其中有什么不妥的地方还请大家指正。
谢谢各位的捧场,本章结束。
[ 本帖最后由 默默 于 2006-6-5 19:28 编辑 ]
作者: 默默 发布时间: 2006-06-05
作者: 幻灵 发布时间: 2006-06-05
作者: 1128sky7 发布时间: 2006-06-05
作者: mikale 发布时间: 2006-06-05
引用:
原帖由 mikale 于 2006-6-5 19:39 发表你说的这种错误..ZDE可以全部避免...IDE用了就是为了方便....
作者: 默默 发布时间: 2006-06-05
如果关键字打错(比如echo)..语法显示就不同..这个时候你就知道写错了
{},()等会自动补充的..行号自动会显示在每行前面.= =..根本不需要找行号..
[ 本帖最后由 mikale 于 2006-6-5 20:01 编辑 ]
作者: mikale 发布时间: 2006-06-05
引用:
原帖由 mikale 于 2006-6-5 19:58 发表打代码的时候就会报错..提示函数信息..代码不用打全的..所以函数不会写错..分号等漏了..会立即提示的.还有高亮显示..你都不用..服了..起码也要用高亮显示的编辑器..比如UE等..
如果关键字打错(比如echo)..语法 ...
个人感觉呢,人为的避免错误,总比机器提示强哦,HOHO
作者: 默默 发布时间: 2006-06-05
并且IDE并不是随处可取的,嘿嘿
但是呢,mikale说的也没错,IDE的确很方便,可能是默默习惯啦记事本吧,HOHO,上次用UE感觉不太适应,^_^
多谢mikale的捧场.
作者: 默默 发布时间: 2006-06-05
楼主所说的东西大部分都可以避免...
作者: 帅的不能再输啦 发布时间: 2006-06-05
作者: mooncn 发布时间: 2006-06-06
作者: szy_session1987 发布时间: 2006-06-06
作者: fnet 发布时间: 2006-06-06
我帮你转了,以后你继续的时候直接发到原创去。
作者: PHPChina 发布时间: 2006-06-06
作者: 深蓝色 发布时间: 2006-06-07
太喜欢你了
作者: 深蓝色 发布时间: 2006-06-07
}
这也是一个经常犯的错误。:D
作者: Ben 发布时间: 2006-06-08
作者: 深蓝色 发布时间: 2006-06-09
任何开发者都会犯错,PHP的错误报告功能将协助您确认和定位这些错误。可以PHP提供的这些详细描述也可能被恶意攻击者看到,这就不妙了。使大众看不到报错信息,这一点很重要。做到这一点很容易,只要关闭display_errors,当然如果您希望得到出错信息,可以打开log_errors选项,并在error_log选项中设置出错日志文件的保存路径。
由于出错报告的级别设定可以导致有些错误无法发现,您至少需要把error_reporting设为E_ALL(E_ALL | E_STRICT 是最高的设置, 提供向下兼容的建议, 如不建议使用的提示).
所有的出错报告级别可以在任意级别进行修改,所以您如果使用的是共享的主机,没有权限对php.ini, httpd.conf, 或 .htaccess等配置文件进行更改时,您可以在程序中运行出错报告级别配置语句:
<?php
ini_set('error_reporting', E_ALL | E_STRICT);
ini_set('display_errors', 'Off');
ini_set('log_errors', 'On');
ini_set('error_log', '/usr/local/apache/logs/error_log');
?>
小提示
http://php.net/manual/ini.php 对php.ini的选项配置作了详尽的说明。
PHP还允许您通过 set_error_handler( ) 函数指定您自已的出错处理函数:
<?php
set_error_handler('my_error_handler');
?>
上面程序指定了您自已的出错处理函数my_error_handler( ); 下面是一个实际使用的示例:
<?php
function my_error_handler($number, $string, $file, $line, $context)
{
$error = "= == == == ==\nPHP ERROR\n= == == == ==\n";
$error .= "Number: [$number]\n";
$error .= "String: [$string]\n";
$error .= "File: [$file]\n";
$error .= "Line: [$line]\n";
$error .= "Context:\n" . print_r($context, TRUE) . "\n\n";
error_log($error, 3, '/usr/local/apache/logs/error_log');
}
?>
小提示
PHP 5还允许向set_error_handler( )传递第二个参数以限定在什么出错情况下执行出定义的出错处理函数。比如,现在建立一个处理告警级别(warning)错误的函数:
<?php
set_error_handler('my_warning_handler', E_WARNING);
?>
PHP5还提供了异常处理机制,详见http://php.net/exceptions
作者: alex 发布时间: 2006-06-12
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28