比如我需要判断某个函数返回值,当它为-1或者-2时分别以不同原因die();
那么以下两种表达方式哪种更好些呢?从性能方面、逻辑方面和程序可读行方面。
方式一:
if($result=='-1'){
  die('错误原因一');
}elseif($result=='-2'){
  die('错误原因二');
}else{
  code goes here……
}
方式二:
if($result=='-1'){
  die('错误原因一');
}
if($result=='-2'){
  die('错误原因二');
}
code goes here……
方法一的缺点:整个主程序被套在一个else里面,导致else的反括号距离超远,如果类似这样的容错处理一多,整个主程序将被套在N多层的大括号里面,一不留神很容易搞不清楚有多少层括号,容易导致括号层数错误。
方法二的缺点:直观上看起来,似乎前面只是if组成的分支结构,一旦由于程序改动,在if容错里,被改成了echo之类的,并没有及时使用die()或者exit()结束程序,将会使整个程序的流程发生改变,本不应该被执行的语句被执行了。

解决方案 »

  1.   

    这个缺点其实并不存在,你完全可以像方法二那样把else里面的东西直接写在后面。这个缺点也不是方法二独有的,方法一同样有这个问题。个人感觉应该不用太纠结这个问题,写清楚就好(缩排、注释等),就具体这个例子来说,我喜欢第一种写法,另外,switch-case 也不错啊 :)
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
      

  2.   

    我认为:对于多条件并列关系采用方法一,elseif就是这个意思,用switch也是不错的,速度快无冗余步骤
    至于可读性可通过注释与良好的代码规范来提高
      

  3.   

    楼上说的很有道理了,其实我认为吧还是用1吧,要不然elseif这语言结构就不必用了,存在就是有他的道理的
      

  4.   

    方法一:只走唯一一个
    方法二: 你会走俩遍if
    效率上没什么大的差别、当你条件N多时、就该注意使用哪种情况了个人认为你方法一的缺点是个人编码规范和编码习惯的问题、真心不存在、从可读性可维护性上看来第一种  基本都能看出来是互斥事件、因为肯定只走一个条件里去、第二种  不清除你这么做是干什么、到底是走第一种还是走第二种条件、确实读不懂、
    至于提示错误原因、像一楼所说、应该放到独立模块里去处理、(错误提升模块就是错误提示模块的职责、其他的事它不去管、它不关心你做什么。)
      

  5.   

    果断用 switch 条件越多 效率越明显.
      

  6.   

    这种情况用 switch case 也行的。 
      

  7.   

    To 3楼:谢谢
    To 4楼:方法二就不存在这样的问题了哦,因为即使你改动了前面的分支,由die()变成echo,仍然不会窜到另一个分支去的,而方法一,相当于把无措分支作为排错的后续环节了。两种方法是以不同的逻辑看待同一个东西的
    To 5楼、8楼、9楼:不用switch的原因一在于判断的对象可能不在同一个参数,比如可能是a==-1和b==-2。另一个原因是这样的判断并不“整齐”,他们不是在同一个步骤中判断的。比如你可能首先判断传入参数,无措后拼接字符串,而连接数据库又要判断一次是否连接成功了,发送SQL后又要判断是否有数据,像这样的,走几步判断一下,如果全用方法一,可想而知,就套了很多层括号了流程类似下图:
    程序代码
       ↓
    容错判断→报错
       ↓
    程序代码
       ↓
    容错判断→报错
       ↓
    程序代码
       ↓
    容错判断→报错
       ↓
    …………
      

  8.   

    一般都用方法一,一次循环,或者switch判断。
      

  9.   

    你说的情况,我细想了一下,很有道理,我给你一一解答,
    首先,本着代码鲜明、速度快捷方面考虑,原则是
    类型相同能用switch就用,使用多if能ifelse就用,对于单if或是2个(类似bool型)用if elsea==-1和b==-2这是可以的,你查查switch break的功效,
    switch($aa){
    case -1:
    case -2:
    echo "这是-1或-2";
    break;
    }
    这样的优点是,switch是优化项目时最常用的,速度算然不用说,缺点是,你有N种可能就N个case,否则跑default里去了,你说的不整齐不知啥意思,我觉得还好了,你用if写出来两个比效下还是switch更整齐我觉得
    switch通常处理超过多个时用上的,你接下来举几个例子:
    传参数判断后拼接,判断是两态的true or false,就用if(){}else{}就够,通常只用一个,若为非return false;
    你后面的sql查询也是两态的,也只要一个if(false == $result){return false;}下面继续读取数据库内容.
    结构还不明了吗
      

  10.   

    To 14楼:
    我说的“不整齐”的意思,在后面做出了解释哦。“比如你可能首先判断传入参数,无措后拼接字符串,而连接数据库又要判断一次是否连接成功了,发送SQL后又要判断是否有数据。”类似这样的情况就没法用switch对付了。
    这个流程就好像探雷一样,每走一步或者几步,就要做一下判断,然后再走几步,再做判断。拿上面那个例子讲吧,如果你要用switch判断,放在什么时机呢?只有确认了传入参数正确之后才能拼接字符串,只有确认了数据库连接成功了才能发送sql,只有判断有数据返回才能读取数据。
    至于你说的最后一段话,我看了好几遍都没看懂你表述的是什么意思?你的“if(false == $result){return false;}”是伪码还是什么?你这之中的return false又代表什么?如果代表的是退出,那不就等同于我说的方法二么?
      

  11.   

    首先这个return false;可以写入一个类方法里,通过外面检查是否为false确定是否成功的
    这无所谓,你改为die(123);好了
    你说进入时要检测有无参数,比方说$id;这确实要测的,就像我说的bool型的结果,就一个if搞定,那就是为非返回(显示错误)
    而你在下面组合成sql语句时不用再测这相$id了,上面查过了不是吗
    你需要对结果进行检查$result,失败会返回false的,所以还是bool型结果,一个if搞定
    switch一般是条件多于两个时使用,而你最初的两段代码再合适不过的了,ifelse也不是不行,这本来就没多少可争的,个人爱好,但是总也得考虑性能、美观与可读性及扩展优化等
      

  12.   

    To 17楼:
    你说的这段话貌似就是没看法的意思了,我就是说在顶上给出的两条思路里,哪个处理方式可读性和可靠性更好。
    至于这种状况不能用swtch,是我对于上面叫我用swtch的同仁的回应。
    至于你说的把判断封装起来,至少对于我目前的问题来说,自带的已经封装得够好了一步就可以达成了,没有必要也没有办法再进行封装了。
      

  13.   

    1比较好吧。但是如果多的话 switch 会比较好
      

  14.   

    1比较好。如果多的话 switch 会比较好