作为一个好习惯,我所有重载的__get函数是否应该像http://us3.php.net/manual/en/language.oop5.overloading.php#object.isset中的示例一样包含调试代码?
public function __get($name)
{
echo "Getting '$name'\n";
if (array_key_exists($name, $this->data)) {
return $this->data[$name];
}
/*question specific code from here on*/
$trace = debug_backtrace();
trigger_error(
'Undefined property via __get(): ' . $name .
' in ' . $trace[0]['file'] .
' on line ' . $trace[0]['line'],
E_USER_NOTICE);
return null;
}
如果包含在我重载的每个类中,它似乎最终会成为很多重复的代码。
答案 0 :(得分:1)
没有。您的重载__get函数根本不需要看起来像这个例子。
恕我直言,避免这些神奇的功能是个好主意。它们看起来很有吸引力,但使用这种“魔力”会导致难以维护的代码。至少,这是我的经历。我今天“遵循”的一个原则是拥有“IDE友好”课程。我的意思是:如果我使用的是Eclipse PDT,并且$variable
属于给定的类,则自动完成应该显示所有可用的方法和属性。使用这些神奇的方法,我们永远无法分辨出可用的东西。
这仅仅是一般性建议,可能不适用于您的具体案例。
答案 1 :(得分:0)
我会抛出异常而不是debug_backtrace()
和trigger_error()
。
虽然情况不同。如果密钥不存在,您可能希望完全执行其他操作。
答案 2 :(得分:0)
在这种情况下没有“良好做法”。
取决于对象的预期行为(取决于任务,仅此而已)你:
null
(或其他预定义值)答案 3 :(得分:0)
没有。该示例获取成员变量并将其存储在数组成员变量中。你不应该在任何地方超载。你应该把它放在父类中,让它继承。
此外,触发错误的输出是老派。创建一个新的异常类并改为抛出它,例如PropertyNotFoundException。
答案 4 :(得分:0)
您可以在全局实用程序函数中包装您最终使用的任何异常处理,这将有点DRYer。您还可以使用AOP库在现有类中注入此功能。