返回一些以及FALSE

时间:2012-05-12 07:58:29

标签: php

我正在构建一个库,我想知道如果有可能以及如何在这里完成最佳方法:基本上我想要根据类中的结果显示一些不同的消息。< / p>

的伪:

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

如何以良好的方式实现这一目标?我假设我需要某种变量,我会给出一个值然后我会有一些方法()如果设置了会返回错误信息,我到目前为止是否正确?我该怎么办?

3 个答案:

答案 0 :(得分:5)

某些语言中(例如Python,通过异常处理对结构化程序流进行了很好的优化并且通常被接受),您可以使登录返回没有值但是使用描述性错误代码抛出相关的异常。 / p>

然后伪代码你可以这样做:

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

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

因此,既然你想返回两个值(一个布尔值和一个字符串),那么逻辑行动就是简单地返回一个带有布尔和字符串字段的compound LoginResult对象。

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

答案 1 :(得分:4)

全局变量(C like)

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

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变量,因为它为使用相同错误消息基础结构的更多函数提供了空间,只需将它们放入类中即可。

答案 2 :(得分:1)

这个答案只是为了说明我对Nobody的答案的评论,所以不要赞扬Nobody。您可以编写一个仅用于登录的类,它可以保存错误消息。

class CLogin
{
  public $error_message;

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

或者您只需通过引用传递参数即可显示错误消息。

修改

因为我相信它是如此重要not to use mixed-typed return values,我写了一篇关于这些功能陷阱的文章。