当前位置:  开发笔记 > 编程语言 > 正文

如何自动加载扩展类?

如何解决《如何自动加载扩展类?》经验,为你挑选了2个好方法。

我打算使用PHP的自动加载功能动态加载所需的类文件.现在,如果每个函数都有一个单独的文件,这可能会造成巨大的混乱,所以我希望有一种方法可以将相关的类保留在1个类文件中,并且仍然可以自动加载

function __autoload($class_name){
    include('classes/' . $class_name . '.class.php');
}

假设有一个类名动物,然后是另一个名为dog的类.狗类扩展了动物类,现在如果我打电话给狗类而不打电话给动物类,动物类文件是否仍会加载?



1> gahooa..:

您是否考虑过对班级位置的明确定义?有时将相关类分组很有意义.

这是一种经过验证的处理方式.

此代码放在auto_prepend_file(或包含在第一个)

class Import
{
    public static $_AutoLoad = array();
    public static $_Imported = array();

    public static function Load($sName)
    {
        if(! isset(self::$_AutoLoad[$sName]))
            throw new ImportError("Cannot import module with name '$sName'.");

        if(! isset(self::$_Imported[$sName]))
        {
            self::$_Imported[$sName] = True;
            require(self::$_AutoLoad[$sName]);
        }
    }

    public static function Push($sName, $sPath)
    {
        self::$_AutoLoad[$sName] = $sPath;
    }

    public static function Auto()
    {
        function __autoload($sClass)
        {
            Import::Load($sClass);
        }
    }
}

在您的bootstrap文件中,定义您的类以及它们所在的文件.

//Define autoload items
Import::Push('Admin_Layout',        App::$Path . '/PHP/Admin_Layout.php');
Import::Push('Admin_Layout_Dialog', App::$Path . '/PHP/Admin_Layout.php');
Import::Push('FileClient',          App::$Path . '/PHP/FileClient.php');

最后,通过调用启用AutoLoad

Import::Auto()

其中一个好处是你可以定义"模块":

Import::Push('MyModule',          App::$Path . '/Module/MyModule/Init.php');

然后在需要时显式加载它们:

Import::Load('MyModule');

最好的部分之一是你可以Import::Push在模块中有额外的行,它将在运行时定义它的所有类.



2> Frank Farmer..:

如果我打电话给狗类,但不打电话给动物类,动物类文件是否仍会加载?

是.当您加载一个扩展另一个类的类时,PHP必须加载基类,以便它知道它正在扩展什么.

re:每个文件存储多个类的想法:这不适用于您提供的自动加载功能.每个文件一个类实际上是最佳实践,特别是对于自动加载的类.

如果文件中有多个类,则实际上不应尝试从该文件中自动加载任何类.

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有