Php 方法中的所有变量都必须是对象属性吗?(菲律宾)
我正在学习OO 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
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();