2010-11-25 95 views
1

我正在学习OO PHP,并试图直接获得一些编码实践。下面是一些代码,我使用了错误(和除外)削减版本处理:方法中的所有变量都需要是对象属性吗? (PHP)

final class MyErrorExceptionHandler { 

    private $level = array(); // error levels to be handled as standard errors 
    private $path = array(); // full path to file 
    private $path_short; // filename plus working dir 

    public function myErrorHandler($severity, $message, $file, $line) { 
     if (error_reporting() & $severity) { // error code is included in error_reporting 
      $this->level = array(E_WARNING => 'warning', 
       E_NOTICE => 'notice', 
       E_USER_WARNING => 'user warning', 
       E_USER_NOTICE => 'user notice'); 
      if (array_key_exists($severity, $this->level)) { // handle as standard error 
       /*$this->severity = $severity; 
       $this->message = $message; 
       $this->file = $file; 
       $this->line = $line;*/ 
       $this->printMessage($severity, $message, $file, $line); 
      } else { // fatal: E_USER_ERROR or E_RECOVERABLE_ERROR use php's ErrorException converter 
       throw new ErrorException($message, 0, $severity, $file, $line); 
      } 
     } 
    } // fn myErrorHandler 

    private function printMessage($severity, $message, $file, $line) { 
     echo ucfirst($this->level[$severity]) . ': ' . $message; 
     $this->shortenPath($file); 
     echo ' in ' . $this->path_short . ' on line ' . $line; 
    } // fn printMessage 

    private function shortenPath($file) { 
     $this->path_short = $file; 
     $this->path = explode(DIRECTORY_SEPARATOR, $file); 
     if (count($this->path) > 2) { // shorten path to one dir, if more than one dir 
      $this->path_short = array_pop($this->path); // filename 
      $this->path_short = end($this->path) . DIRECTORY_SEPARATOR . $this->path_short; // dir+file 
     } 
    } // fn shortenPath 

} // cl MyErrorExceptionHandler 

这个问题的标题可能有点过,因为我不上的术语100%。基本上我想弄清楚几件事情。

  1. 是否明确声明$level$path为数组?
  2. 应该宣布$level(因为它是$this->level)?如果是这样,我是否在明智的地方分配了它的价值(E_WARNING等)?这个构造函数(这里没有显示)是更聪明的选择吗?
  3. 请注意myErrorHandler()中的注释块。最初我已经将所有这些属性都声明在课程顶部,然后在没有任何参数的情况下调用$this->printMessage()。哪一种更正确?如果我保持代码原样,我是否想在printMessage()内使用$this->severity = $severity等?
  4. 因此,这将是更好的:

更换

$this->shortenPath($file); 
echo ' in ' . $this->path_short . ' on line ' . $line; 

$path_short = $this->shortenPath($file); 
echo ' in ' . $path_short . ' on line ' . $line; 

最终并给予shortenPath()一个返回值?

我意识到这是几个不同问题的混杂体,但我试图得到的是关于正确声明/使用变量/属性的风格的常见问题,特别是在处理方法时。

总结:什么时候应该使用$this->foo = $foo

回答

3

编辑:对不起,我在下面假设你会创建一个新的'对象'的实例,每个错误显然你没有做。刚编辑我的答案反映了这一点。

“我应该何时使用$ this-> foo = $ foo?”

可能有几种情况下你会这样做,但通常情况下,如果你在一个方法中创建$ foo并希望让整个对象访问它。

例如,如果您想要调用一个对象并在该特定对象内使用该对象(如果它没有意义扩展)。你会做这样的事情:

$foo = new DataModel(); 
$this->foo = $foo; 

OR

$this->foo = new DataModel(); 

该对象可以是装饰或别的东西与错误处理相关的,上面的代码通常会在你的构造特征。您随后可以随时访问该对象的方法:

$this->foo->objectMethod(); 

..并且在评论中注明这个答案:

“你会把$ file分配给对象吗?”

我不会将$文件分配给对象, 这是为什么。 “财产”一词的含义是“属于”。在你的 的情况下,你的类是一个错误处理程序。 $文件不属于错误 处理程序,它属于一个错误 实例。如果您的班级是 MyErrorHandler_Error(为每个触发错误的 实例创建),那么 $文件将是该 类的一个属性,以及$ line和$ level。

要回答什么,我可以从你的其他问题:

  1. 它既不是。我会考虑它的偏好。

  2. 是的 - 任何变量或值应该可用于您的整个对象,并需要对象正常运行,应该可以在您的构造函数中设置,如果不在您的变量声明(不确定术语那里)这是班级的顶峰。

  3. 阅读下面的评论。因为这个特定的类处理多个错误实例 - 将这些错误的属性分配给对象不是最佳实践,因为您将用每个新错误覆盖它们。但是,如果您需要访问历史数据,则将所有错误和错误属性存储在分配给该对象的数组中是有意义的。例如,目前,如果你创建一个新的错误 - 那就是你正在做的。您无法访问此对象创建的任何旧错误。

  4. 见上

你也应该到指定的对象属性时,想想冲突。你可能会重新分配,因为如果是这样,旧的财产将会消失。相当简单,但仍然需要考虑。

+0

谢谢!不过,我想知道这个问题:“如果你需要多个方法中的任何属性,那么建议你将该属性赋值给你的对象。如果printMessage()是使用这些属性的唯一方法,那么no。”拿,例如,$文件。它从myErrorHandler(),printMessage()到shortenPath()。这些都可以用一种方法,但我为了可读性/实用性而将其分解。所以是的,这不仅仅是一种方法,但是$文件只会经过这个链。对于Exceptions我有一个很长的方法,我没有在这里包含,也没有涉及到$ file。 – CartoonChess 2010-11-25 19:55:58

相关问题