如何自动加载扩展类?

时间:2009-09-17 22:42:31

标签: php class autoload

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

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

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

4 个答案:

答案 0 :(得分:9)

您是否考虑过明确定义班级位置?有时将相关课程分组很有意义。

这是一种经过验证的处理方法。

此代码位于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行,它们将在运行时定义它的所有类。

答案 1 :(得分:6)

  

如果我打电话给狗类,但是   不叫动物类,是的   动物类文件仍然被加载?

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

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

如果文件中有多个类,则不应尝试自动加载该文件中的任何类。

答案 2 :(得分:0)

是的,除非您不包含/要求类文件,否则它将加载。

您必须始终导入包含所需PHP代码的任何文件。 PHP本身无法猜测您为类文件指定的名称。例如,与Java不同,PHP对类没有任何文件命名要求。

解决此问题的常用方法是将相关类分组到一个文件中。创建“模块”。

答案 3 :(得分:0)

有一个解决方法,我刚刚使用它,它似乎工作:

假设我们有一个名为animals的自动加载类存储在animals.class.php中。在同一个文件中,您可以使用其他扩展动物的类

    class animals{
        static function load(){
            return true;
        }
    }


    class dogs extends animals{

    }

    class cats extends animals{

    }

现在......当你需要使用你的类dogs时,你需要PHP自动加载它的父类(并且这样你确定它将解析同一文件中的所有extendend类)所以你只是必须写:

animals::load();
$fuffy = new dogs();