3

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

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

假设有一个类名称为动物,然后是另一个类名称为狗。狗类扩展了动物类,现在如果我调用狗类但不调用动物类,还会加载动物类文件吗?

4

4 回答 4

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);
        }
    }
}

在您的引导文件中,定义您的类以及它们所在的文件。

//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在模块中添加额外的行,这将在运行时定义其所有类。

于 2009-09-17T23:12:23.787 回答
6

如果我要调用狗类但不调用动物类,还会加载动物类文件吗?

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

回复:每个文件存储多个类的想法:这不适用于您提供的自动加载功能。每个文件一个类确实是最佳实践,尤其是对于自动加载的类。

如果您在一个文件中有多个类,那么您真的不应该尝试从该文件中自动加载任何类。

于 2009-09-17T22:51:23.157 回答
0

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

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

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

于 2009-09-17T22:49:17.660 回答
0

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

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

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


    class dogs extends animals{

    }

    class cats extends animals{

    }

现在......当你需要使用你的类时,dogs你需要 PHP 自动加载它的父类(这样做你确信它也会解析同一个文件中的所有扩展类)所以你只需要写:

animals::load();
$fuffy = new dogs();
于 2015-05-25T22:50:33.157 回答