你只是想返回一个结果,但使用 throw 一般是抛出异常。
很多时候返回 status 为0,其实并不是异常。
我觉得这些时候使用 throw 是不合适的。
所谓的异常,应该是“它本来应该是这样的,但结果却不是”,才需要抛出异常。
比如你要处理一张图片,传的参数指向的文件存在,文件后缀也存在,但读取数据后却不能正确处理,这时抛个异常是可以理解的,但我个人觉得这还不够好。
因为我就遇到过,使用 thinkPHP 3.2 的图片处理类,遇到不能处理的图片,直接抛出了异常,但其实对我来说,如果处理图片有问题 ,是可以直接跳过去的。
也就是说:只有“这一步如果出错,后面的代码执行就完全没有意义或者完全不能执行”的时候才去抛出异常,否则只需要返回结果,给使用者(可能是控制器)去处理就好了。
对于楼主的需求,ThinkPHP 是有内置的方法的,比如控制器中有 success() 和 error() 两种方法来满足楼主的需要,当然,我个人比较喜欢 ThinkPHP 3.2的处理方式,比如简洁,ThinkPHP 5中的这两个方法添加了不必要的参数,写起来倒挺麻烦的。
但这两个方法只在控制器中有,模型中默认是没有的,当然,如果你喜欢的话,也可以加到模型中去。
但我个人同样不太推荐。处理返回结果或页面跳转的任务还是交给控制器会比较好。
模型中,其实可以自己定义个类似的方法,比如:
function succ($data="",$status=1){
return array(
'status'=>$status,
'info'=>$data,
);
}
function error($msg=""){
return succ($msg,0);
}
你在模型中直接 return succ($data);或 return error($msg);即可。
控制器中根据返回的数组,再使用$this->success()或$this->error();当然,如果你在使用ThinkPHP 5,也像我一样比较喜欢 ThinkPHP 3.2 的风格,这两个方法你是可以改成3.2的风格的。
说回楼主和你看到的大神的代码,基本思想都差不多,只不过你直接返回一个数组,而“大神”却直接抛出异常,我不喜欢这位大神的风格。
但你和“大神”都喜欢写重复的 "status'=>1,"msg"=>......,我则比较喜欢把它装进函数或方法中,毕竟这两个操作是使用非常频繁的。
关于代码中较多 if/else 的情况,我一般使用两种方法解决:
短的判断可以用三目运算符代替;
很多时候 if 时使用了return ,后面就可以不写 else 了 。
补充:
概括一下:
模型中建议使用 return ,而不是抛出异常,return 的数据可以自己封装个函数或方法;(当然,要结合业务的具体需求!)
抛出异常意味着程序的终止,在非必须的情况下不要这样做;
控制器中直接使用 success 和 error 或 ajaxReturn 方法即可。
但如果把楼主看到的“大神”的代码从模型中移到控制器的话,应该是合理的(除了重复的代码有点多外)。
我个人是不太喜欢使用 throw,但我查看了一下 ThinkPHP 5 和 ThinkPHP 3.2 的源码,其中的 success和 error 方法除了使用参数复杂性不同外,还有一点区别就是 3.2直接使用 exit()结束程序,而 5.0 版本中使用的是 throw 一个异常类。
应该有理由相信,使用 throw 可能会比如说 exit 更好。
于是,我找到一种说法:
我不了解底层的机制,但我觉得这种说法是比较可信的。