PHP China | 中国开源之路 's Archiver

夢諾雨蓒 发表于 2008-11-15 01:50

授人渔而非鱼之程序调试及解决问题之道(11月16日更新完毕)

经常看见有很多新手(当然我也是个新手)在坛子里发帖XX错误是什么意思,XX错误怎么解决……,其实很多问题早就已经有人问过,用站内搜索很快就会找到答案的。这里我只想谈谈遇到错误和问题我们应该怎样去解决,才会不断提高自身解决问题的能力。好了这之前的都是废话,请时间宝贵者略过,往下看:

[b]一、学习PHP需要那些工具?[/b]
    俗话说工欲善其事,必先利其器。学习一门语言也是一样的,学习PHP我们至少应该要有:PHP手册,MYSQL手册,金山词霸,IDE(编辑器)。这些工具的用途在后面逐个说明。

[b]二、出现问题和错误时我们首先要做什么呢?[/b]
    首先我们要知道问题是什么!如果连问题是什么都不知道那我们还怎么解决呢?让错误这个妖魔现身很简单:开启PHP的错误报告即用户端输出的错误信息。(没明白?简单一点就是我们运行的PHP页面出错了系统会在页面上打印出错误信息,那直接给个图,够直观了吧……)。
图1:错误信息
[attach]27114[/attach]

大部分使用套件搭建的PHP运行环境默认错误报告都是打开的,没有打开则可以:
    1、修改php.ini文件
       将php.ini中display_errors = off 设置为 display_errors = on,表示将错误信息输出到用户端,再将error_reporting设置为error_reporting = E_ALL & ~E_NOTICE 表示将输出错误类型设置为输出所有的错误,除了提示。
    2、在文件中动态设置
       在程序中使用error_reporting ([ int $level ] )函数可以动态设置,具体参数所代表的意义请查看PHP手册。
    好了,错误打印出来了,想要知道是什么错误还难吗?当然打印出来的都是E文,E文不好就用金山词霸翻译一下大意我想应该还是能理解的,就练我这个E文白痴都能用金山翻译出来,相信你肯定不会有问题的了。曾经一大哥就非得把类似上图这段的错误贴出来问这个错误是什么意思,我当时心里那个寒啊!

[b]三、知道问题是什么了,我们该怎样处理?[/b]
    其实很多问题只要你看明白了,很可能就解决了。当然还是有很多解决不了的,那么我们首先找到出现错误的语句,仔细查看上下语句是否有错误,这里也有可能不是该条报错的语句出错,也可能是附近的程序导致的,所以你要仔细了。这样还是解决不了?那继续吧!看来这个问题还比较难!不怕,继续!虽然夜已经深了,但是黎明离我们越来越近了!如果打印的错误中有关于某某函数错误、或者函数参数类型等等涉及到函数的,查手册。手册中对函数的说明是很详细的。尤其注意函数在php各版本的有效性、参数类型及返回值等等。如果问题仍然存在,那继续往后走。这下就该百度、Google了,一般问题都能解决。你要是怕百度、Google答案太多不统一有两个办法,一个你就是自己把代码跑起来都试试就知道了。另外就来PPC了,开发论坛里肯定会有人问相关问题的,首先不要急着发贴问,先搜索下以前的帖子看看精华,很有可能你遇到的问题别人早就已经问过了,你还问干嘛?浪费时间,直接看答案呗。没有搜到那就发帖咯,这里有很多高手的(怎么有点像打广告!)。想当年我也是在这里潜水潜的很深啊。。。潜多了现在终于会游泳了,虽然经常被呛。。。哈哈
    我想经过上面三步问题应该能解决了吧,不过善于学习的人肯定会不到万不得已是不会问别人的,自己研究出来和问别人搞出来是两码事,自己研究出来说明你已经知其然及知其所以然了,至于问别人嘛,如果有认真体会的话可能也会达到知其然知其所以然的效果,反正究竟明白否,自己最清楚。(这里我们不讨论解决问题的效率问题以及和某些时间比较宝贵的人争论,以上解决问题的顺序仅供参考)。
    当然,我们不能总遇到问题就问吧!我们得学会自己解决问题,哦,对了我发这贴貌似有说怎样调试程序的,那我们就来看看怎样调试程序了。

################################################################################

程序调试详解:

[b]1、传统调试方法[/b]
   传统调试方法对老phper是最熟悉不过了,因为那时候php的debug还没发展起来。传统的调试方法包括echo,print_r(),var_dump()等等,这里说说应该怎样使用这些常用的输出语句来调试我们的程序:
   [b]echo:[/b]输出变量当前值,生成的sql语句,以及字符串等等我们想要知道的变量值。比如说我们要执行sql查询,但是程序没有正常工作sql没有执行,这时最好的方法就是将sql语句echo出来看看语法有没有错误,再放到数据库命令行去执行一遍看看有没有结果。比如下面的调试代码:
[php]
<?php
  $sql = "select * from `t_test` where `user_id`='{$id}'";
  //这里我可以先将sql语句输出来看看执行的sql语句是否正确
  //很有可能变量$id就没有接收到值,导致sql执行无结果。
  echo $sql;
  $result = mysql_query($sql);
  if ($result)
  {
      //...
  }
  else
  {
     //...
}
?>
[/php]
       那么我们想知道程序在运行中的值究竟是怎样变化的,肯定不难了,一个echo已经很强大了。其实这里我们可以直接获取到刚才执行的sql语句是否有错误。代码如下:
[php]
<?php
  $sql = "select * from `t_test` where `user_id`='{$id}'";
  $result = mysql_query($sql);
  echo mysql_errno();     //打印上一个MySQL操作中的错误编码
  echo mysql_error();     //打印上一个MySQL操作产生的文本错误信息,这个对我们的用处很大
  if ($result)
  {
      //...
  }
  else
  {
     //...
  }
?>
[/php]
    [b]print_r():[/b]print_r()函数主要是针对数组和对象的,用print_r()打印数组和对象值既简洁明了,对于数组和对象的调试非常有用,如下代码我们能很直观的看出数组下标的具体情况:
[php]
<?php
  echo '<pre>';      //html的<pre>标签作用不用我多说了吧
  $arr = array('id'=>'1001',
               'name'=>'test',
               '数字索引',
               'other'=>'Other infomation.');
  print_r($arr);
  echo '</pre>';
?>
[/php]
输出结果如下:
[php]
Array
(
    [id] => 1001
    [name] => test
    [0] => 数字索引
    [other] => Other infomation.
)
[/php]
       [b]var_dump()[/b]:这个函数主要是针对bool类型的变量的,因为我们在输出bool值时php会自动转换类型,如果输出值为false那么没有任何输出,这对我们调试是不利的,用var_dump()能够看到变量的类型以及值,当然这里不只是bool类型的变量可以用,你想跟踪的任何变量的类型变化过程都可以用这个函数。如下:
[php]
<?php
  $a = '5';
  var_dump($a);
  echo '<br>';

  $a = $a + 1;
  var_dump($a);
  echo '<br>';

  $a = FALSE;
  var_dump($a);
?>
[/php]
使用var_dump()函数我们可以知道变量的类型是怎样变化的,上面代码的输出结果如下:
[php]
string(1) "5"    //字符串类型括号中的是串的长度,后面是字符串值
int(6)              //整型变量括号中的即是其值
bool(false)     //这里我们可以看见$a变成了bool变量的false值
[/php]
       我们在调试程序的时候首先要确定错误范围,不要漫无目的的echo等等,对于一些逻辑错误我们往往可以预测错误出现的代码段,做法很简单,比如说我们在执行条件分支的时候某个分支没有执行,但这又不符合我们的逻辑,我们只需要在分支前分支条件echo出来,看看条件是否符合,再在分支里echo一条信息,看看是否是程序实际执行了分支,用来说明我们的分支没有执行还是分支内的其他语句功能没有实现。
[b]2、使用调试工具[/b]
     这里我就以zend studio for eclipse 6.1为列说说怎么单步调试程序,选择这个IDE的原因是因为debug环境基本不用配置直接可以使用的。调试步骤很简单:
   1、设置断点:即在我们想要程序停下来的地方,但又不终止程序执行,程序完全交给我们来控制。打个比方:就好像你在控制一个行走的人,如果你没有给这个行走的人设置断点他就一直自己走下去,直到走完他想走的路。但是当你给这个人设置一个断点想看看他走路的每个动作是怎样的,这时这个人走到断点处就会自动停下来,然后他完全听你指挥,你叫他往下走一步他就走一步,他不敢走两步,等你看清楚他走路的每个细微动作后,你可以让他自己一下走完该走的路,你可以一直让他一直在那停着。哈哈,是不是很舒服?!(我说的是控制程序,不是只这个拿来打比方的倒霉小子)
     设置断点很简单只需要在IDE的行号处双击鼠标就会产生一个小原点,再双击该行号就取消了设置的断点。如下图:
   [attach]27161[/attach]
     2、单步调试:在设置完断点后在文本编辑区右键选择debug as-->php script程序就开始运行了如下图:
   [attach]27162[/attach]
   这里会弹出一个窗口要求切换到调试界面,点击OK即可。程序默认是停在我们脚本的第一行即背景高亮的行,行前面有个小箭头。如下图:
   [attach]27163[/attach]
   这时我们可以按下F7键程序就会直接运行到我们设置的断点处停下来,这里需要说明的是背景高亮的行是当前还没有执行的语句,也就是程序即将执行的语句。单步调试有几个快捷键:F5(单步跟进调试)、F6(单步调试)、F8(直接运行完所有剩下的程序),所谓单步跟进调试即程序一次只执行一条,而且如果这条语句调用的是函数那么调试程序会跟进到该函数单步执行,而单步调试则仅仅是执行一条当前将要执行的语句,不会跟进。在单步调试时我们就可以动态的看见变量值是怎样一步一步变化的,以及程序逻辑是怎样执行的,很容易找出错误,尤其是逻辑错误。调试过程如下图:
调试界面:
[attach]27164[/attach]
跟进调试:
[attach]27165[/attach]
图上面已经说的很清楚了,多调试几次我想新手掌握起来不难,慢慢就会体会出来的,也会体会到其中的奥妙!哈哈,原来程序调试也这么爽!
我终于写完了。。。收工,睡觉觉   tukiz22

[[i] 本帖最后由 夢諾雨蓒 于 2008-11-16 02:39 编辑 [/i]]

七月十五 发表于 2008-11-15 08:20

一、需要哪些工具?
金山词霸很庞大可以用词霸豆豆,IDE推荐用Eclipse PDT,FireFox的FireBug和DOM查看器很不错,进阶一点的可以用ZendDebugger,手册备查。

二、学好英文,如果英文不是很好,慢慢来,善于搜索,提取精准的关键字是一门学问。

三、先自行解决,实在不明白或想不通把不准时到论坛请高人指点迷津。智慧的提出问题,获得方法(渔)而不是仅仅为了解决眼前的错误(鱼)。

akas628 发表于 2008-11-15 08:48

非常支持lz!:victory:
但是还是很多新手对自己写的检查不仔细,新手对问问题的依赖性很强
虽然我不是老手!

sheak 发表于 2008-11-15 09:16

在本地调试就把错误打开咯!
一般的问题看错误报告就可以解决
我用的多的还是GOOGLE的翻译 哈哈

夢諾雨蓒 发表于 2008-11-16 02:33

其实新手学习的不仅仅是语言本身,更重要的是要学会解决问题的方法,提高自己解决问题的能力,为工作打下良好的基础,这才是我们学习的根本。假如你只学会了一门语言而没有学会如何解决问题,等你到了岗位,你还要再学习如何解决问题估计那时候就有得你受了。。。往往一个很简单的需求你就转换不成实际的代码,而你能做的是什么呢?仅仅是根据别人写的详细设计,写出代码来纯粹就一代码工人,那样的人生还有什么乐趣啊。。。

konakona 发表于 2008-11-16 10:04

楼主文章不错
8过这些,俺早期就了解了………………:handshake:

某个人 发表于 2008-11-16 10:57

[quote]原帖由 [i]夢諾雨蓒[/i] 于 2008-11-16 02:33 发表 [url=http://bbs.phpchina.com/redirect.php?goto=findpost&pid=723132&ptid=90970][img]http://bbs.phpchina.com/images/common/back.gif[/img][/url]
其实新手学习的不仅仅是语言本身,更重要的是要学会解决问题的方法,提高自己解决问题的能力,为工作打下良好的基础,这才是我们学习的根本。假如你只学会了一门语言而没有学会如何解决问题,等你到了岗位,你还要再 ... [/quote]
写出代码来纯粹就一代码工人,那样的人生还有什么乐趣啊。。。
说得太有道理了。纯粹的代码工人。。。不是说,现在国内80%的程序员都是代码工人。不仅仅php。。我很多学java的朋友,我和其讨论mvc。居然说必须要用,为什么。mvc到底具体作用是什么,等等设计模式和效率并不清楚。。讨论不出个东西来。

xiejohnson 发表于 2008-11-17 20:08

学习,值得深入的地方

fhjr999 发表于 2008-11-19 09:31

[quote]原帖由 [i]某个人[/i] 于 2008-11-16 10:57 发表 [url=http://www.phpchina.com/bbs/redirect.php?goto=findpost&pid=723350&ptid=90970][img]http://www.phpchina.com/bbs/images/common/back.gif[/img][/url]

写出代码来纯粹就一代码工人,那样的人生还有什么乐趣啊。。。
说得太有道理了。纯粹的代码工人。。。不是说,现在国内80%的程序员都是代码工人。不仅仅php。。我很多学java的朋友,我和其讨论mvc。居然说必须要用 ... [/quote]


确实,很多人学习东西都不会深入思考,只要能记下来,会用就算完事。所以代码中处处透着死板,很多知识无法灵活应用。

huanglujun 发表于 2008-11-19 10:09

哎,我现在正迷茫呢,工作快两年了,代码到是堆了不少,可借签来的占了60%,自己写的那40%感觉很死,重用性极差。惭愧...

fhjr999 发表于 2008-11-19 10:47

[quote]原帖由 [i]huanglujun[/i] 于 2008-11-19 10:09 发表 [url=http://www.phpchina.com/bbs/redirect.php?goto=findpost&pid=731396&ptid=90970][img]http://www.phpchina.com/bbs/images/common/back.gif[/img][/url]
哎,我现在正迷茫呢,工作快两年了,代码到是堆了不少,可借签来的占了60%,自己写的那40%感觉很死,重用性极差。惭愧... [/quote]

试着闲暇的时候,将你积累的代码组织一下,尽量做到灵活通用,但是也没必要通用性太高。

这是一个思考琢磨的过程,尝试抛开别人的思路多琢磨琢磨,每天都会有新发现。

几个月前,我就感觉我的水平还不错了,可是现在回头来看,我当时的水平还菜的很,我现在对我的水平也还比较满意,但是几个月之后,我想我还是会认为现在的我很菜。

每天回头来看昨天,都能看到自己的进步,这样才完美。

夢諾雨蓒 发表于 2008-11-19 15:54

其实学习的目的和根本就是学习解决问题的方法,提高解决问题的能力。而这肯定离不开不断总结,只有不断回头总结才会发现自身问题所在,从而不断提高。所谓一通百通,我想应该是在精通一门的基础,对其他东西触类旁通吧。

feifengxlq 发表于 2008-11-19 16:27

不错,加上XDEBUG的使用详解就更加全面了。

加精!

fhjr999 发表于 2008-11-19 16:49

[quote]原帖由 [i]夢諾雨蓒[/i] 于 2008-11-19 15:54 发表 [url=http://www.phpchina.com/bbs/redirect.php?goto=findpost&pid=732891&ptid=90970][img]http://www.phpchina.com/bbs/images/common/back.gif[/img][/url]
其实学习的目的和根本就是学习解决问题的方法,提高解决问题的能力。而这肯定离不开不断总结,只有不断回头总结才会发现自身问题所在,从而不断提高。所谓一通百通,我想应该是在精通一门的基础,对其他东西触类旁通 ... [/quote]

赞成,我也经常这样跟别人说,学会一门编程语言,你能用几年??又能干几年的程序员??只有独立解决问题的能力才是最重要的,培养的好了,老死的时候都还能用来想一个别致的死法。

独立解决问题的能力,我觉得归根结底在以下几个方面:

1,强悍的分析能力
2,强悍的总结能力
3,强悍的逻辑推理能力
4,自身的思维模式

这其中思维模式其实才是最重要的,有好的思维模式,其他三洋自然都可以锻炼出来,我简单说下我的思维模式:

1,以怀疑的眼光来看待事物(即使是最牛B的程序员跟我说的东西,我也会琢磨一下,是否可行,并努力找出他言语中的漏洞,当然,不是为了喷他)
2,以审视的眼光看待事物(即使是再牛B的东西,我也会分析一下有何优点,有何缺点,优点如何发扬,缺点如何弥补)
3,以居高临下的眼光看待事物(不管多么牛B,多么困难,首先我就在战略上蔑视你,任何事物都要当作你手中的棋子)
4,见到的东西并且认为有用的,感兴趣的就分门别类收集到脑子里(简直都快成一个小型百科全书了)
5,三人行,必有我师(即使是一个很小的孩子,我曾经向一个一年级小学生请教何为质数,向我关系密切的子侄辈请教问题更是家常便饭)
6,大脑是最宝贵的财富(只要我的大脑 还能思考,我就是会认为我是世界上最富有的人)
7,手可以闲着,但是大脑不能(不要让你的财富白白流失)
8,任何事物都是相互关联的(编程思想可用于其他地方,比如企业管理,家庭管理,最近正琢磨这事,同样,其他地方的东西,在编程中同样可以借鉴)
9,跟着别人走的时候,那是我在学习,我的目标,是走到他的前面(不用永远跟着别人的思路,应该有自己的想法,并且要努力超越)
10,厚积薄发(要学会忍耐积蓄力量的过程中的痛苦)

[[i] 本帖最后由 fhjr999 于 2008-11-19 16:53 编辑 [/i]]

ws00377531 发表于 2008-11-20 09:30

[quote]原帖由 [i]huanglujun[/i] 于 2008-11-19 10:09 发表 [url=http://bbs.phpchina.com/redirect.php?goto=findpost&pid=731396&ptid=90970][img]http://bbs.phpchina.com/images/common/back.gif[/img][/url]
哎,我现在正迷茫呢,工作快两年了,代码到是堆了不少,可借签来的占了60%,自己写的那40%感觉很死,重用性极差。惭愧... [/quote]

哥们能有40%已经是牛了啊! 我基本都是在重复copy动作!

naodai 发表于 2008-11-24 15:41

这么好的贴,怎么没人定呢!!

顶!!!

naodai 发表于 2008-11-24 15:44

tukiz15 tukiz15

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.