当函数正常执行时,从PHP函数返回错误的最佳方法是什么?
实施例
public function login($user, $pw){
if(!$this->verifyUser($user))
// return error about invalid user
}
else if (!$this->verifyPw($pw)){
// return error about invalid pw
}
else {
// return OK
}
}
来电 - 将回复作为网络用户界面的JSON
public function doLogin($user,$pw){
$res = $this->login($user, $pw);
return json_encode($res);
}
一方面,我可以理解返回结果作为一个数组,但我觉得这对于这样的低级函数没有意义。也许他们应该返回错误代码,然后调用者必须查找错误代码字符串?
答案 0 :(得分:3)
假设你在一个物体中,你基本上有三个主要选择:
$this->errors
数组并返回false
$this->collector->addError('blah blah');
并返回false
对于前两种方法,您必须检查返回值,并根据该值拉出错误列表。但是这两个选项都有收集多个错误的好处。
异常方法在耦合方面稍微轻一些,但你只能得到一个错误。
至于实际返回的内容,我建议使用错误代码+描述字符串。但是你的班级不会返回该字符串。相反,您的错误应该使用一些“占位符”进行注册,以后会被翻译:
$this->errors[] = [
'code' => 52,
'msg' => 'authentication.login.invalid-password',
];
当您从对象中提取错误时,它基本上就是这样的条目列表,然后您只需通过翻译服务运行它们。
如果异常,当您的对象抛出$e->getCode()
异常时,相同的信息将驻留在$e->getMessage()
和InvalidPassword
。
答案 1 :(得分:1)
对于API响应,tereško的答案将沿着正确的行。
对于DOM响应,您可以执行以下操作:
我过去只使用了一个响应代码来实现这么简单的事情:
http://php.net/manual/en/function.http-response-code.php代码为401
public function login($user, $pw) {
header_remove(); # Clear all previous headers.
if( !$this->verifyUser($user) || !$this->verifyPw($pw) ){
http_response_code(401);
exit;
}
http_response_code(200);
exit;
}
jQuery的:
$.ajax({
.......
statusCode: {
200: function() {
window.location.href = '/';
},
401: function() {
alert( "Login Failed" );
}
}
});