PHP类 - 状态消息应该在类的内部还是外部?

时间:2012-05-22 17:46:59

标签: php oop class

我有一个类可以执行某些操作,当它完成后会返回true,但如果出现任何错误,它将返回false。现在我的问题是,如果此类事件的状态消息保存在类(Example1)内或类外(Example2),其中类可能只提供错误代码以帮助区分发生的事情。

    class Example1 {

       private $var;
       private $status;

       public function doSomething($var) {
         $this->var = $var;

         if (!is_numeric($this->var)) { 
            $this->status = 'Please provide a number'; 
            return false; 
         }

         if (empty($this->var)) {
            $this->status = 'Please fill the field';
            return false;
         }

         $this->status = 'Ok, you submitted a number, cool.';
         return true;
    } 

         function getStatus() {
            return $this->status;
         }
}

示例2:

    class Example2 {

       private $var;

       public function doSomething($var) {
         $this->var = $var;

         if (!is_numeric($this->var)) {  
            return false; 
         }

         if (empty($this->var)) {
                return false;
         }

             return true;
    } 

}

示例1在我看来使用起来更方便,代码读起来就像一首诗,但同时似乎不太可重用,这取决于你使用类的内容,你可能希望成功/错误消息具有不同的语法。

所以基本上我的问题是通常的做法是什么?

3 个答案:

答案 0 :(得分:1)

第一个例子:你的硬编码错误信息是......坏的。如果您稍后不再查看$object->status,则无法看到错误消息 第二个例子:如果出现问题,你就会知道,但你不知道为什么。

我建议避免这两种方式并为更加面向对象的方法抛出异常(我想这就是你想要的,因为你正在使用类:)。

答案 1 :(得分:1)

这完全取决于你。如果您更容易理解错误消息并帮助您调试代码,那么请务必使用它。提出不同错误的错误代码可能只会减慢开发过程,除非您想隐藏用户的真实错误(但在这种情况下,您有几个选项,其中一个选项是不打印错误以进行筛选用户可能会看到它们。)

答案 2 :(得分:1)

这不是你要问的,但在一个函数中有多个return语句通常被认为是不好的做法。问题是,它使得更难以知道退出函数的位置,这使得不清楚执行的是什么。在您的示例中,如果第一个测试成功,则不执行其余代码。如果你之后设置了一些属性会发生什么?有时他们会被设定,有时他们不会。要摆脱这个问题,最好只有一个return语句。将执行更多代码,您将不得不改变编码方式以便习惯它。

以下是您所提供的代码的含义示例:

public function doSomething($var) {
     $this->var = $var;
    $result = false;
     if (!is_numeric($this->var)) { 
        $this->status = 'Please provide a number';  
     }
     else if (empty($this->var)) {
        $this->status = 'Please fill the field';
     }
     else{
        $this->status = 'Ok, you submitted a number, cool.';
        $result = true;
    }
     return $result;
}