我正在构建一个库,我想知道如果有可能以及如何在这里完成最佳方法:基本上我想要根据类中的结果显示一些不同的消息。< / 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
如何以良好的方式实现这一目标?我假设我需要某种变量,我会给出一个值然后我会有一些方法()如果设置了会返回错误信息,我到目前为止是否正确?我该怎么办?
答案 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)
如果您使用静态类型语言进行编程,则可能会使用全局变量来处理错误消息(这会污染您的全局命名空间):
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;
}
这在逻辑上与全局变量相同,但不会受到污染问题的影响:
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();
使用通过引用传递的其他参数来返回错误代码(这会给函数调用增加额外的复杂性):
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'];
同样,你可以使用这样的结构:
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,我写了一篇关于这些功能陷阱的文章。