2011-02-01 176 views
-1

有一些旧的PHP代码我有已经定义了这样的功能(和在php中自动加载类 - 这是一个好习惯吗?

function __autoload($class_name) 
{ 
    $filename=CLASSES. strtolower($class_name) . '_class.php'; 
    if (file_exists($filename)) 
    { 
     require_once $filename; 
    } 
} 

其中CLASSES就是这些特定(类名)_class.php文件所在的路径。

上述功能是在到处都包含一个文件

这是一个可以接受的做法 - ?在使用它像这样任何陷阱

回答

1

如果类定义未知,自动加载函数将加载文件。因此,作为@弗罗那和@安迪 - 帕顿的地方,你不必担心自动加载你所有的课程。

您正在加载所有代码中的函数,但只有在调用函数时(例如,通过new VeryLittleUsedClass()或通过静态调用VeryLittleUsedClass::theFunction()),才会加载“verylittleusedclass.class.php”。

我想说这是一个很好的做法。你不需要在不知道你是否仍然使用它们的情况下包含所有文件,如果你需要的话,这些类将被加载。

虽然你需要确保你的文件名正确。

+0

的确,我正要写这个。 `__autoload()`不会加载所有的类,但只加载当前脚本中使用的类。这是一个非常好的做法*几乎总是被框架使用。 – Shikiryu 2011-02-01 13:25:22

2

我认为这是偏好的问题我使用了比较特殊的AUTOL oad函数来减少包含错误文件的几率。它绝对减少了包括维护。

1

我建议使用这个自动加载https://gist.github.com/169617(也称为PEAR风格自动加载磁带机)

它适用于本公约

类名称:Core_DB_Mysql 文件路径:核心/ DB/MySQL的

你可以将你的班级分组

 
Core/Cache 
    Core/Cache/APC 
    Core/Cache/Memcache 

Core/Models 
    Core/Models/User 
    Core/Models/Post 

确定本公约你不需要一次又一次

1

拇指良好的规则是手动包括你,你知道,肯定会被使用并保留类,可能所有类扫描文件夹用于自动加载器。例如,您可能有一个数据库库类,某些类型的设置类,国际化类,注册表类,接口定义类,某种类型的自定义异常类,模板引擎类以及导致实际控制器类将会被使用。

所以,你应该使用 包括$ file1.php 包括$ file2.php 等手动包括所有的人都非常接近你 index.php文件顶部(或任何文件首先由浏览器发起) ....

这会给你最好的性能和这些类保证由APC缓存(如果你使用的原因APC缓存)

现在你的类里面可能会有一些有条件地使用一个或其它一些逻辑类,视情况

例如

如果(请求:: isAjax()){ AjaxResponder :: sendResponse(); } else { return $ page; }

现在可以让自动加载器加载AjaxResponder类,因为它可能甚至不需要。所以,如果一个类可能不需要,让autoloader处理它,否则手动包含。

真的很简单的规则。

另外,在自动加载器功能中使用智能逻辑非常重要。确保 你有尽可能少的条件测试,也从来没有使用任何类型的目录扫描来查找类文件。

如果使用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仍然需要执行额外的检查来查看是否已包含文件。

相关问题