Php 方法中的所有变量都必须是对象属性吗?(菲律宾)

Php 方法中的所有变量都必须是对象属性吗?(菲律宾),php,parameters,this,declaration,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; // f

我正在学习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
这个问题的标题可能有点不对劲,因为我对术语不是百分之百的了解。基本上我在想一些事情

  • $level
    $path
    明确声明为数组是否正确
  • $level
    是否应按原样声明(并使
    $this->level
    )?如果是这样,我是否将其值(
    E_WARNING
    等)分配到了一个明智的位置?构造器(此处未显示)是更明智的选择吗
  • 请注意
    myErrorHandler()
    中的注释块。最初,我在类的顶部声明了所有这些属性,然后在没有任何参数的情况下调用了
    $this->printMessage()
    。哪种方法更正确?如果我保持代码不变,我是否希望在
    printMessage()
    中使用
    $this->severity=$severity
  • 那么,最好是:
  • 替换

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

    最后,在
    shortenPath()
    中给出一个返回值

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


    总而言之:我应该在什么时候使用
    $this->foo=$foo

    编辑:对不起,我在下面假设您将创建一个新的“object”实例,每个错误显然都不是您所做的。刚刚编辑了我的答案以反映这一点

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

    您可以在几种情况下执行此操作,但通常是在方法中创建$foo并希望整个对象都能访问它

    例如,如果您想调用一个对象并在这个特定对象中使用它(如果扩展没有意义)。您可以执行以下操作:

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

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

    $this->foo->objectMethod();
    
    …并在对该答案的评论中指出:

    “是否将$file分配给该对象,因为该对象在多个方法中使用?”

    我不会将$file分配给对象, 原因如下。这个词的语义 “财产”是指“属于”。在你的 在这种情况下,您的类是一个错误处理程序。 $file不属于该错误 处理程序,它属于一个错误 例如。如果你的班级是 MyErrorHandler\u错误(为每个 触发错误的实例),然后 $file将是该文件的一个属性 类,以及$line和$level

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

  • 两者都不是。我会考虑它的偏好。

  • 是-如果不是在类顶部的变量声明(不确定术语)中,那么应该在构造函数中设置所有变量或值,这些变量或值应该对整个对象可用,并且是对象正常运行所必需的

  • 阅读下面的评论。因为这个特殊的类处理多个错误实例,所以将这些错误的属性指定给对象不是最佳做法,因为每个新错误都会覆盖它们。但是,如果需要访问历史数据,将所有错误和错误属性存储在指定给对象的数组中是有意义的。例如,现在,如果您创建了一个新的错误-这就是您正在做的。您无法访问此对象创建的任何旧错误

  • 见上文


  • 将特性指定给对象时,还应考虑冲突。您是否可能重新分配,因为如果是这样,旧财产将不复存在。很简单,但还是要考虑的事情。不过,我想知道的是:“如果您在多个方法中需要任何属性,那么建议您将该属性分配给对象。如果printMessage()是唯一使用这些属性的方法,那么就不要。”例如,$file。它从myErrorHandler()到printMessage(),再到shortenPath()。这些可能都在一个方法中,但为了可读性/实用性,我将它们分开。是的,这是不止一种方法,但$file将只在该链中运行。对于异常,有一个很长的方法,我在这里没有包括,它从不涉及$file。我不会将
    $file
    分配给对象,原因如下。“财产”一词的语义是指“属于”。在您的例子中,您的类是一个错误处理程序<代码>$file不属于错误处理程序,它属于错误实例。如果您的类是
    MyErrorHandler\u Error
    (为触发错误的每个实例创建),那么
    $file
    将是该类的属性,以及
    $line
    $level
    。实际上,这一行出现在构造函数中:set\u Error\u handler(数组($this,'MyErrorHandler'));。也就是说,只有在触发错误时,PHP才会调用myErrorHandler()。所以,这个类的任何部分都不会被手动访问。也许我应该在一个简单一点的地方开始我的OO PHP冒险P所以我同意你的看法:如果这些方法/属性是在类外/手动访问的,我只需要$this->foo=$foo一切。但既然这永远不会发生,我想也许我应该只使用$foo/$file/任何东西,除非最佳实践另有规定。@netcoder:这正是我在上述(后期)评论中想要表达的意思。谢谢@netcoder-完全同意。如果我看一下这个类的预期实现,就会发现:S
    $this->foo = new DataModel();
    
    $this->foo->objectMethod();