2

我正在建立一个库,我想知道是否有可能以及如何在这里完成最佳方法:基本上我希望有一些不同的消息,我可以根据课堂上的结果显示这些消息。

伪:

public function login($username, $password) {
    //query

    if (password hash is verified)

        if (active == false)
            (some sort of MESSAGE HERE! like "User is not activate...")
            return false

        if banned
            some sort of message
            return false
    else

        message (wrong username or password)
        return false
}

And then on the login

if (login(username, password))
    successfully
    redirect
else
    display the message

如何以一种好的方法实现这一点?我假设我需要某种变量,我会给出一个值,然后我会有一些方法(),如果设置它会返回错误消息,到目前为止我是对的吗?我该怎么做?

4

3 回答 3

5

某些语言中(例如 Python,通过异常处理构建程序流得到了很好的优化并被普遍接受),您可以让您的登录不返回任何值,但抛出带有描述性错误代码的相关异常。

然后你可以明智地使用伪代码:

try
{
    login(user, password);
    redirect(page);
}
catch (MyLoginException ex)
{
    displayMessage();
}
catch (GenericException ex)
{
    ...
}

但这仅适用于某些语言。这对于 C 或 C++ 是不可取的,例如,异常处理非常慢,因此应保留用于处理unexcepted情况。PHP看起来几乎在同一条船上。

因此,由于您要返回两个值(一个布尔值和一个字符串),逻辑上的操作过程就是简单地返回一个compound带有布尔值和字符串字段的 LoginResult 对象。

从您的登录方法返回一个 LoginResult 对象的新实例,并使用它的字段来处理重定向和/或显示错误消息。

于 2012-05-12T08:02:52.780 回答
4

全局变量(类似 C)

如果您使用静态类型语言进行编程,您可能会使用全局变量来显示错误消息(这会污染您的全局命名空间):

global $login_error_message;

function login($user, $password)
{
  if(success)
   return true;
  if(failure)
  {
    global $login_error_message;
    $login_error_message = 'Error message';
    return false;
  }
}

if(login($user, $password))
  redirect
else
{
   global $error_message
   echo $error_message;
}

成员变量(类似 C++)

这在逻辑上与全局变量相同,但不受污染问题的影响:

class LoginClass
{
   private $error_message;

   function login($user, $password)
   {
      if(success)
         return true;
      if(failure)
      {
         $this->error_message = "Error message";
         return false;
      }
   }

   function get_error_message()
   {
      return $this->error_message;
   }
}

$loginInstance = new LoginClass();
if($loginInstance->login($user, $password))
   redirect
else
   echo $loginInstance->get_error_message();

通过引用传递(类似 C/++)

使用通过引用传递的附加参数来返回错误代码(这给函数调用增加了额外的复杂性):

function login($user, $password, &$error_msg)
{
   if(success)
     return true;
   if(fail)
   {
     $error_msg = 'Error message';
     return false;
   }
}

$error_message
if(login($user, $password, $error_message))
   redirect
else
   echo $error_message;

混合返回类型

但由于这是 php(所以不是静态类型),您可以执行以下操作:

成功时返回 true (我认为不需要特殊输出),否则返回错误消息。使用该功能时,您会遇到类似的事情:

function login($user, $passord)
{
   if(success)
     return true;
   if(failure)
     return "Error message";
 }

$login_result = login($user, $password);
if($login_result === true)//note the ===, as == would be true on non empty strings too
  success
else
  echo $login_result;

返回关联数组

当然你也可以返回一个包含两个值的数组:

function login($user, $password)
{
  if(success)
     return array("success" => true, "error_msg" => "");
  if(failure);
     return array("success" => false, "error_msg" => "Error message");
}

$login_result = login($user, $password);
if($login_result['success'])
  redirect
else
  echo $login_result['error_message'];

返回类实例(类似 C/++)

同样,您可以使用这样的结构:

class LoginReturn
{
  public $success;
  public $error_message;

  LoginReturn($success, $error_mesage)
  {
     $this->success = $success;
     $this->error_message = $error_message;
  }
};

function login$user, $password)
{
   if(success)
     return new LoginReturn(true, "");
   if(failure)
     return new LoginReturn(false, "Error message");
}

$login_result = login($user, $password);
if($login_result->success)
  redirect
else
  echo $login_result->error_message;

结论

鉴于这些例子,我认为人们可以看到它们的优点和缺点。就我个人而言,我会使用 Member 变量变体,因为它为使用相同错误消息基础结构的更多函数提供了空间,只需将它们放入类中即可。

于 2012-05-12T08:04:08.460 回答
1

这个答案只是为了说明我对Nobody的回答的评论,所以请把功劳归于Nobody。您可以编写一个仅用于登录的类,该类可以保存错误消息。

class CLogin
{
  public $error_message;

  function login($user, $password)
  {
    if (successfull)
      return true;
    else
    {
      $this->error_message = $error_message;
      return false;
    }
  }
};

或者您可以简单地通过引用传递错误消息的参数。

编辑:

因为我相信不使用混合类型的返回值非常重要,所以我写了一篇关于此类函数的陷阱的文章。

于 2012-05-12T09:03:14.400 回答