有一些遗留的PHP代码我已经定义了这样的函数(以及
function __autoload($class_name)
{
$filename=CLASSES. strtolower($class_name) . '_class.php';
if (file_exists($filename))
{
require_once $filename;
}
}
其中CLASSES是这些特定(classname)_class.php文件所在的路径。
上述功能位于随处可见的文件中。
这是否是可以接受的做法 - 任何陷入这样的问题?
答案 0 :(得分:2)
我认为这是一个偏好问题。我使用不太通用的自动加载功能来减少包含错误文件的几率。它肯定会削减包括维护。
答案 1 :(得分:1)
如果未知类定义,则自动加载功能会加载文件。因此,正如@ fran-Verona和@Andy-Paton所害怕的那样,你不必担心自动加载你所有的课程。
您正在所有代码中加载该函数,但只有在调用它时才会加载“verylittleusedclass.class.php”(例如,通过new VeryLittleUsedClass()
或通过静态调用VeryLittleUsedClass::theFunction()
)。< / p>
我说这是好习惯。如果不知道是否仍然使用它们,则不需要包含所有文件,如果需要,将加载类。
您需要确保正确命名文件。
答案 2 :(得分:1)
我建议使用此自动加载器https://gist.github.com/169617(也称为PEAR样式自动加载器)
适用于此惯例
类名:Core_DB_Mysql 文件路径:Core / DB / Mysql
您可以将您的课程分组;
Core/Cache Core/Cache/APC Core/Cache/Memcache Core/Models Core/Models/User Core/Models/Post
好了这个约定你不需要一次又一次地扫描文件夹
答案 3 :(得分:1)
经验法则是手动包含您确定将使用的所有类,并保留可用于自动加载器的类。
例如,您可能有一个数据库库类,某种类型的设置类,国际化类,注册表类,接口定义类,某种类型的自定义异常类,模板引擎类,以及导致实际的控制器类使用。
因此,您应该将所有这些手动包含在非常接近您的顶部 index.php(或浏览器首次启动的任何文件)使用 包括$ file1.php 包括$ file2.php 等等....
这将为您提供最佳性能,并且这些类保证由APC缓存(如果您使用原因的APC缓存)
现在你的课程中你可能有一些逻辑,有条件地使用一个或另一个类,视情况而定
例如
如果(请求:: isAjax()){ AjaxResponder :: sendResponse(); } else { 返回$ page; }
现在可以让autoloader加载AjaxResponder类,因为它甚至可能不需要。
因此,如果可能不需要某个类,请让自动加载器处理它,否则手动包含。
这是非常简单的规则。
此外,在自动加载器功能中使用智能逻辑非常重要。确保 你有尽可能少的条件测试,也从不使用任何类型的目录扫描来查找类文件。
如果您使用spl_autoload_register,请记住要注意注册的自动加载功能的顺序。订单如果重要的话。
智能自动加载器类的一个很好的例子就在这里
http://groups.google.com/group/php-standards/web/psr-0-final-proposal
注意,它不使用任何检查来查看(file_exists())或类似的东西。 它只使用了 require()并依赖require函数在文件未找到时引发错误。
切勿在自动加载器中使用include_once()或require_once。 这是没有意义的,因为自动加载器不会在类中被调用已经包含但是require_once和include_once仍然需要执行额外的检查以查看文件是否已经包含在内。