我有兴趣获得一些关于我从某个地方获取的技术的反馈.
当函数可以成功或失败时,我会使用它,但是您希望获得有关失败原因的更多信息.做同样事情的一种标准方法是使用异常处理,但我经常发现它有点超过这种情况,加上PHP4不提供此功能.
基本上,该技术涉及成功返回true,以及一些这相当于为false失败.这是一个展示我的意思的例子:
define ('DUPLICATE_USERNAME', false); define ('DATABASE_ERROR', 0); define ('INSUFFICIENT_DETAILS', 0.0); define ('OK', true); function createUser($username) { // create the user and return the appropriate constant from the above }
这样做的好处在于,在您的调用代码中,如果您不关心用户创建失败的原因,您可以编写简单易读的代码:
if (createUser('fred')) { // yay, it worked! } else { // aww, it didn't work. }
如果您特别想检查它为什么不起作用(用于记录,显示给用户或做任何事情),请使用===的身份比较
$status = createUser('fred'); if ($status) { // yay, it worked! } else if ($status === DUPLICATE_USERNAME) { // tell the user about it and get them to try again. } else { // aww, it didn't work. log it and show a generic error message? whatever. }
我看待它的方式,其好处是,正常的期望是成功执行这样的函数将返回true,并且失败返回false.
缺点是你只能拥有7 "error" return values: false, 0, 0.0, "0", null, "", and (object) null.
如果你忘记使用身份检查,你可能会让你的程序流程出错.其他人告诉我,使用常量就像enum
他们都等于假的那样"ick"
.
所以,重申一个问题:这样的做法有多接受?你会推荐一种不同的方式来实现同样的目的吗?
我同意其他已经说过WTFy方面的内容的人.如果它是明确记录的功能,那么它不是一个问题,但我认为采用替代路由返回0表示成功和整数表示错误代码更安全.如果您不喜欢这个想法或全局最后一个错误变量的想法,请考虑将您的函数重新定义为:
function createUser($username, &$error)
然后你可以使用:
if (createUser('fred', $error)) { echo 'success'; } else { echo $error; }
在createUser中,只需填充$ error就会遇到任何错误,并且由于引用,它可以在函数范围之外访问.