PHP __get重载代码很好的做法

时间:2012-02-24 01:41:07

标签: php oop

作为一个好习惯,我所有重载的__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;
}

如果包含在我重载的每个类中,它似乎最终会成为很多重复的代码。

5 个答案:

答案 0 :(得分:1)

没有。您的重载__get函数根本不需要看起来像这个例子。

恕我直言,避免这些神奇的功能是个好主意。它们看起来很有吸引力,但使用这种“魔力”会导致难以维护的代码。至少,这是我的经历。

我今天“遵循”的一个原则是拥有“IDE友好”课程。我的意思是:如果我使用的是Eclipse PDT,并且$variable属于给定的类,则自动完成应该显示所有可用的方法和属性。使用这些神奇的方法,我们永远无法分辨出可用的东西。

这仅仅是一般性建议,可能不适用于您的具体案例。

答案 1 :(得分:0)

我会抛出异常而不是debug_backtrace()trigger_error()

虽然情况不同。如果密钥不存在,您可能希望完全执行其他操作。

答案 2 :(得分:0)

在这种情况下没有“良好做法”。

取决于对象的预期行为(取决于任务,仅此而已)你:

  1. 触发通知/警告(如您的示例所示)
  2. 抛出异常
  3. 返回null(或其他预定义值)

答案 3 :(得分:0)

没有。该示例获取成员变量并将其存储在数组成员变量中。你不应该在任何地方超载。你应该把它放在父类中,让它继承。

此外,触发错误的输出是老派。创建一个新的异常类并改为抛出它,例如PropertyNotFoundException。

答案 4 :(得分:0)

您可以在全局实用程序函数中包装您最终使用的任何异常处理,这将有点DRYer。您还可以使用AOP库在现有类中注入此功能。