方法中的所有变量都需要是对象属性吗? (PHP)

时间:2010-11-25 19:21:16

标签: php parameters this declaration

我正在学习OO 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()。哪种方法更正确?如果我按原样保留代码,是否要在$this->severity = $severity内使用printMessage()等?
  4. 那么,是否会更好:
  5. 替换

    $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

1 个答案:

答案 0 :(得分:3)

编辑:抱歉,我在下面假设您将为每个错误创建一个“对象”的新实例,显然您没有这样做。刚编辑我的答案以反映这一点。

“我什么时候应该使用$ this-> foo = $ foo?”

在某些情况下你可以这样做,但通常是你在一个方法中创建$ foo并希望然后由整个对象访问它。

例如,如果您想调用一个对象并在该特定对象中使用它(如果扩展没有意义)。你可以这样做:

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

OR

$this->foo = new DataModel();

该对象可能是装饰器或与错误处理相关的其他内容,上述代码通常会在构造函数中出现。然后,您可以随时使用以下方法访问该对象的方法:

$this->foo->objectMethod();

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

  

“你会将$ file分配给对象,因为在多个方法中使用了这个文件吗?”

     

我不会将$ file分配给该对象,   这就是原因。这个词的语义   “财产”是指“属于”。在你的   case,你的类是一个错误处理程序。   $ file不属于错误   处理程序,它属于错误   实例。如果你的班级是   MyErrorHandler_Error(为每个人创建   然后是触发错误的实例   $ file将是该属性   class,以及$ line和$ level。

从其他问题中回答我的问题:

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

  2. 是 - 任何变量或应提供给你的整个对象和正常运行所需的对象,或许应该被你的构造函数中设置,如果没有在变量声明(不知道术语的出现)值在课堂顶部。

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

  4. 见上文

  5. 在为对象分配属性时,您还应该考虑冲突。您是否可能重新分配,因为如果是这样,旧的财产将会消失。相当简单但仍然需要考虑。