我无法提出解决方案来处理在整个应用程序中一致的成功或失败(错误),到目前为止,我一直坚持从3种可能的解决方案中做出决定。(我对OOP相对较新)
例如,如果我想使用CURL登录远程api,我可以创建一个类似于以下方法的类。
class Api
{
var $curl;
var $user;
var $pass;
var $buffer;
function __construct($user,$pass)
{
$this->curl = new curl();
$this->user = $user;
$this->pass = $pass;
}
functon login()
{
$url = 'http://example.com/login/';
$postfields = array($user => $this->user, $pass => $this-pass);
$this->buffer = $this->curl->post($url,$postfields);
}
}
在使用login()之后,我们有一些可能的结果,成功登录,糟糕的登录(来自api的信息,例如用户/传递不正确),页面加载失败(服务器不可用)或可能是CURL错误。(更多问题可能但列出足够)
一种基本方法是创建另一种方法loginSuccessful()
loginSuccessful()
{
if(strstr($this->buffer,'Welcome user: "zzzz"'))
return true;
if(strstr($this->buffer,'Incorrect user or pass'))
return false;
if(strstr($this->buffer,'server unavailable'))
return false;
if(curl_error($this->curl->ch))
return false;
else
return false;
}
我可以在发布数据后在login()方法中调用它。
functon login()
{
$url = 'http://example.com/login/';
$postfields = array($user => $this->user, $pass => $this-pass);
$this->curl->post($url,$postfields);
if(loginSuccessul())
return true;
else
false;
}
这种方式当然是太基本的,并没有提供有关错误的大量信息,为了改善这一点,如果成功则返回true,如果不成功则返回错误消息(而不是false)。
loginSuccessful()
{
if(strstr($this->buffer,'Welcome user: "zzzz"'))
return true;
if(strstr($this->buffer,'Incorrect user or pass'))
return 'Incorrect user or pass';
if(strstr($this->buffer,'server unavailable'))
return 'server down';
if(curl_error($this->curl->ch))
return curl_error($this->curl->ch);
else
return 'some other error';
}
我们使用它和以前一样,但是对于返回不同的类型感觉不对。(有时是布尔值,有时是字符串)
另一种可能的方法是保持第一种方法中的true / false样式,但是构建另一种方法,例如loginError(),我们再次使用login()放置
functon login()
{
...
....
if(loginSuccessul())
return true;
else
return loginError();
}
现在这给了我们一些详细的错误信息,但即使这种方法感觉也不对,因为总的来说我将很多文本信息与逻辑混合在一起,似乎我打破了一些 SOLID 原则。
可能问题在于班级结构和我的方法,我所做的一切都是不正确的,因为我在一个糟糕的结构/思维模式中工作。
提前感谢任何想法。
答案 0 :(得分:0)
为了做到这一点:你想要一个能够返回一些内容的登录功能,这样你知道一切都很好,加上一些额外的东西,以确定在功能失败时什么不起作用?
我知道有两种方法可以实现这个目标:
返回bool(true / false是否有效)并在您的类中提供一个额外的错误字符串,该字符串不会被返回并且可以单独设置。有关详细信息,请参阅MSDN中的GetLastError。您可以在PHP脚本中实现类似的功能。
例外情况( - > PHP: Exception - Manual)
if(strstr($this->buffer,'server unavailable')) throw new Exception("some wild exception occured, feed me with some data and catch me later");
就我个人而言,我建议您使用例外,因为它们通常比手动构建错误代码和错误字符串更好/更容易维护并且耗时更少。