如何自动加载扩展类?(How to autoload extended classes?)

2019-08-07 11:33发布

我打算使用PHP的自动加载功能,动态地加载需要,只有类文件。 现在,这可以创建一个巨大的混乱,如果每一个功能都有一个单独的文件,所以我希望和要求是有办法有相关的类留在1个的文件,仍然是自动加载

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

比方说,有一类动物的名字,然后又狗类命名。 狗类扩展动物类,现在如果我叫的狗类,但不叫动物类,将动物类文件仍然可以加载?

Answer 1:

如果我是叫狗类,但不叫动物类,将动物类文件仍然可以加载?

是。 当装载扩展另一个类的类,PHP必须因此它知道它的延伸称重的基类。

回复:这不会与你所提供的自动加载功能工作:存储多个类,每个文件的想法。 每个文件一类是真正的最佳实践,特别是对于自动加载类。

如果你在一个文件中多个类,你真的不应该从该文件试图自动加载任何类。



Answer 2:

你有没有考虑过你的类位置的明确定义是什么? 有时,它使一个很大的意义相关的类。

这里是把它处理一个行之有效的方法。

这个代码被放置在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);
        }
    }
}

而在你的引导文件,定义类,它们是在什么文件。

//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');

最后,通过调用实现自动加载

Import::Auto()

其中的好处之一是,你可以定义“模块”:

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

然后在需要时明确加载它们:

Import::Load('MyModule');

而最好的部分之一就是你可以有更多的Import::Push模块,这将确定在运行时其所有类别的线。



Answer 3:

是的,它会加载,除非你不包括/需要的类文件。

你必须始终导入包含所需的PHP代码的任何文件。 PHP本身并不能猜到你给你的类文件的名称。 与Java例如,PHP没有任何文件命名为班级的要求。

常见的方式,以便解决这个问题是在一个单一的文件相关的类。 创建一个“模块”。



Answer 4:

有一个解决办法,我只是用它,它似乎工作:

假设我们已经存储在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();


文章来源: How to autoload extended classes?