处理重复方法调用的最佳做法是什么?

时间:2011-06-04 05:48:53

标签: php

假设我有一个我想要注册的类加载器。

$loader = new ClassLoader;

$loader->register();

当第二次调用方法register()时,我应该:

  1. 抛出一个异常,说明类加载器已经注册
  2. 默默地失败
  3. 返回布尔状态
  4. 如果我选择#1选项,我还会提供一个isRegistered()方法,以便在第二次调用之前进行一些检查。

    处理此方案的最佳方法是什么?

    还有其他更好的选择吗?

4 个答案:

答案 0 :(得分:2)

这取决于方法的作用。在这种情况下,如果您正在加载一个类来访问静态方法,那么如果该类已经加载,我会默默地忽略该请求。

在这种情况下,程序将保持相同的状态,无论之前是否加载了类(要么加载类,要么它什么也不做;尽管如此,类仍将被加载)。

如果它是具有实例方法/属性的类,那么您不会想要失败;相反,你会想要创建一个新实例。

在这种情况下,当类已经注册时抛出异常只会给使用您的代码的开发人员带来麻烦。但是,如果您执行选择抛出异常,则提供一个isRegistered()方法供他们在加载类之前调用​​。我肯定会在这种情况下使用#2

答案 1 :(得分:2)

您是否考虑过触发警告或通知等事项?

trigger_error("ClassLoader already registered", E_USER_WARNING);

与异常不同,触发错误是在不停止程序执行的情况下查找代码中的缺陷/中断的好方法。保留回溯并在错误日志中输入一个条目。如果这样的错误(注册类加载器两次)继续生产,你会希望它对用户透明(这并不重要),但程序员会收到通知。

答案 2 :(得分:1)

这是我的经验法则: 如果您正在开发其他人将构建的应用程序,则触发错误(或更好的是,抛出异常)是一种可接受的方式,通知其他开发人员他们不必要地重新注册您的班级。
但是,如果代码仅适合您或熟悉代码的一小群人,则触发错误似乎过于热心。除非调用寄存器函数是处理器密集型的,否则我只是说在寄存器函数开头快速检查时返回false应该没问题。

答案 3 :(得分:0)

单身人士或单身人士的做法怎么样?我用它来创建一个全局的智能对象:

在config.php中:

$GLOBALS['config']['SmartyObj']     = 0;

在你的utils.php(或任何你想要使用的)中:

function smartyObject()
{
    if ($GLOBALS['config']['SmartyObj'] == 0)
    {
        $smarty = new SmartyGame();
        $GLOBALS['config']['SmartyObj'] = $smarty;
    }
    else
        $smarty = $GLOBALS['config']['SmartyObj']; 
    return $smarty;   
}  

这个想法是,如果对象存在,则返回对该对象的相同引用。如果没有,则创建它。