PHP函数错误和成功模式

时间:2017-05-20 22:54:28

标签: php

当函数正常执行时,从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);
}

一方面,我可以理解返回结果作为一个数组,但我觉得这对于这样的低级函数没有意义。也许他们应该返回错误代码,然后调用者必须查找错误代码字符串?

2 个答案:

答案 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" );
    }
  }
});