假设我有一个我想要注册的类加载器。
$loader = new ClassLoader;
$loader->register();
当第二次调用方法register()
时,我应该:
如果我选择#1选项,我还会提供一个isRegistered()
方法,以便在第二次调用之前进行一些检查。
处理此方案的最佳方法是什么?
还有其他更好的选择吗?
答案 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;
}
这个想法是,如果对象存在,则返回对该对象的相同引用。如果没有,则创建它。