Php 最佳处理方法;return";?

Php 最佳处理方法;return";?,php,class,Php,Class,我需要一个建议,如何处理与许多不同的回报更好的功能 我的类中有一个简单的登录函数: public function login($email, $password){ $record = // Go to database and find what we need. if($record){ // Check pass, $user_match = TRUE; } else { return 1; //No such user. Please register!

我需要一个建议,如何处理与许多不同的回报更好的功能
我的类中有一个简单的登录函数:

public function login($email, $password){

$record = // Go to database and find what we need.

if($record){
   // Check pass, $user_match = TRUE;
} else {
   return 1;         //No such user. Please register!
}

$active = (1 == $record['is_active']) ? TRUE : FALSE;
$verified = (1 == $record['is_verified']) ? TRUE : FALSE;

//User email and password matched:
if($user_match == true){
   if($verified === true){
       // Start session and insert to db table "online_users"
   // Check that user was inserted to table: $confirm = $stmt->rowCount();

         if($confirm !== 1){
           return 2; //Unexpected technical error. Please try again in a moment.
         }

       return 0;     //0 means that all clear, we good to go.

       } else {
           return 3; //not verified
       }
    } else {
        return 4;    // no match with email and pass, reject!
    }
}
问题是,现在我需要检查所有的退货,比如:

$log = $user->login($_POST['email'], $_POST['pass']);
if($log === 0) {
    //Log in & edirect
} elseif ($log === 1) {
    //No such user. Tell to register
} elseif($log === 2){
    //technical error, try again
} elseif($log === 3){
    //Not verified
} elseif($log === 4){
    //wrong password
现在真的很烦人,想象一下,如果我需要检查20次退货?还有更好的办法吗?如何更高效、更快地完成此任务?
提前感谢。

使用将是提供清晰处理错误代码的一种方法,具体取决于它如何适合您的应用程序的其他部分

正如Nanne所指出的,您不应该在流控制中使用异常:它们应该只指示异常情况。技术错误显然是一种例外情况,为此使用例外将是明确和适当的

对其余部分使用异常不太清楚,但仍然是一种选择。您可以简单地为每个故障条件抛出带有不同错误消息的异常,或者为故障条件抛出具有适当处理程序的不同异常类

这开始破坏异常的语义,这取决于此代码与其余代码的配合方式。例如,能够在别处调用登录函数而不必担心它引发不适当的异常可能是有用的或必要的

最后,可能不需要对每个失败条件进行显式检查并在函数中返回它们。同样,根据需要的灵活性,您可以在成功登录时返回true,或者在失败时返回错误消息(使用
==
验证结果是否为true,而不仅仅是truthy)。或者,您可以返回一个带有success属性和错误条件的对象,这至少使错误处理代码成为检查成功和处理错误代码的问题


如果您需要为每个故障条件使用明显不同的错误处理机制,那么为每个故障情况返回一个错误处理机制至少可以清楚地说明代码中发生了什么。然后,您可以返回
LOGIN\u PASSWORDS\u don\u NOT\u MATCH
而不是一个密码,然后可以在错误代码中检查该密码。

如果您需要许多
if else
语句,最好使用
switch
语句:

$log = $user->login($_POST['email'], $_POST['pass']);

switch ($log) {
   case 1:
     break; 
   case 2:
     break;
   //etc....
}
要澄清错误代码,请使用命名常量或名称=>代码对的静态数组,而不是“幻数”

您可以使用INI文件

在ini文件中写入错误:

1 = "Error"
2 = " Technical"
3 = "Network"
...
并将其保存到和ini文件中。然后使用以下代码:

<?php
$array = parse_ini("er.ini");
echo $array[$log];
?>

您应该重新考虑此函数的用途,并相应地构造返回类型。如果目的是让用户登录,那么只能有一个答案:要么有效,要么无效。因此,函数的主要返回类型应该是布尔值。如何区分不同的失败原因是一个不同的主题

选项1:抛出异常:

try {
    if (!$foo->login()) {
        echo 'Invalid credentials';
    }
} catch (UserNotActiveException $e) {
    ...
} catch (UserNotValidatedException $e) {
    ...
}
不一定是最优雅的选择,因为失败的登录并不是一个真正的例外情况

选项2:在登录提供程序中保存错误状态:

if (!$foo->login()) {
    echo "You're not logged in because ", $foo->loginError();
}
这是否好取决于类的使用方式,否则,您可能不希望使其过于有状态

选项3:将登录问题与用户的状态完全分开:

if (!$foo->login($user)) {
    switch ($foo->currentStatus($user)) {
        case $foo::ALL_OK :
             echo 'Login credentials invalid';
             break;
        case $foo::ACCOUNT_INACTIVE :
             ...
    }
}
选项4:返回状态对象:

$result = $foo->login();
switch ($result->status) {
    case $result::ALL_OK :
        ...
}

这基本上就是你现在正在做的事情,只是没有神奇的数字。

这对情况没有什么帮助,因为现在你需要检查异常,所以你处于同一条船上。另外,您不应该对flow control=>“return 2”使用异常,其余都不是异常情况,不应该抛出异常exceptions@Nanne公平地说,例外情况不应该用于流量控制。不过,我怀疑这可以重写以利用异常。我将扩展我的答案来澄清一下。但是错误的密码或未经验证的用户不应该引发异常,这只是一个应该处理的返回值。似乎我在大多数备选方案中都失败了,但我对我的答案做了一些扩展,以帮助澄清应该在何处使用例外和一些替代方案,因为并非所有情况都是例外情况。不要将异常用于流控制,当然它们是异常。如果有人试图登录,预期的情况是,这将起作用。如果没有,那是个例外。预计用户会错误输入密码,因此如果用户被拒绝(密码错误),也不例外。这是一个正常的日常情况,应该在代码中处理,而不是通过异常处理(因此,是的,“return2”是一个异常,但其他的不是),我认为您是对的@Nanne。据我自己所知,我只能在我的回程表2上加上“try”字。我想你误会了OP。当然。您也可以在汇编中编写它。不过,这不是一个真正的答案。+1-这就是我的答案,但你抢先了我一步。
$result = $foo->login();
switch ($result->status) {
    case $result::ALL_OK :
        ...
}