问题描述
|
假设我有一个要注册的类加载器。
$loader = new ClassLoader;
$loader->register();
当第二次调用方法“ 1”时,我应该:
引发异常,表明类加载器已被注册
默默失败
返回布尔状态
如果我要使用选项#1,我还将提供isRegistered()
方法,以便在第二次调用之前进行一些检查。
处理这种情况的最佳方法是什么?
还有其他更好的选择吗?
解决方法
您是否考虑过触发警告或通知之类的内容?
trigger_error(\"ClassLoader already registered\",E_USER_WARNING);
与异常不同,触发错误是在不停止程序执行的情况下查找代码中的缺陷/中断的好方法。您保留回溯并在错误日志中获得一个条目。如果这样的错误(两次注册一个类加载器)正在生产中,您希望它对用户透明(这不是关键),但是会通知程序员。
, 这取决于该方法在做什么。在这种情况下,如果您正在加载一个类以访问静态方法,那么如果该类已经被加载,我将无提示地忽略该请求。
在这种情况下,无论该类之前是否已加载,程序都将保持相同的状态(要么加载该类,要么不执行任何操作;尽管如此,该类仍将加载)。
如果它是一个具有实例方法/属性的类,那么您就不会失败;相反,您将要创建一个新实例。
在这种情况下,当类已经注册时抛出Exception异常只会为开发人员使用您的代码带来麻烦。但是,如果确实选择引发Exception,则必须在加载类之前提供isRegistered()方法供它们调用。在这种情况下,我肯定会选择#2。
, 这是我的经验法则:
如果您正在开发其他人可以使用的应用程序,则触发错误(或者更好的是,引发异常)是一种可以通知其他开发人员不必要地重新注册您的类的方法。
但是,如果该代码仅适合您或一小部分熟悉该代码的人,则触发错误似乎过于热情。除非调用寄存器函数需要占用大量处理器资源,否则我会说,只需在寄存器函数开始时通过快速检查返回false即可。
, 单例或类似单例的方法怎么样?我用它来创建一个全局的smarty对象:
在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;
}
想法是,如果对象存在,则您将对该对象返回相同的引用。如果没有,则创建它。