Php 如何自动加载扩展类?

Php 如何自动加载扩展类?,php,class,autoload,Php,Class,Autoload,我计划使用PHP的自动加载功能来动态加载所需的类文件。现在,如果每个函数都有一个单独的文件,这可能会造成一个巨大的混乱,所以我希望并询问是否有一种方法可以让相关的类保留在一个类文件中,并且仍然自动加载 function __autoload($class_name){ include('classes/' . $class_name . '.class.php'); } 假设有一个类名为动物,然后是另一个类名为狗。Dogs类扩展了animals类,现在如果我调用Dogs类而不调用ani

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

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

假设有一个类名为动物,然后是另一个类名为狗。Dogs类扩展了animals类,现在如果我调用Dogs类而不调用animals类,是否仍会加载animals类文件?

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

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

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

如果我叫狗课但是 不叫动物课,对吗 动物类文件仍将被加载

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

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


如果一个文件中有多个类,您确实不应该尝试从该文件自动加载任何类。

您是否考虑过类位置的显式定义?有时将相关的类分组是很有意义的

这里有一个行之有效的处理方法

此代码放在一个
自动预编文件中(或先包含)

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

//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::Load('MyModule');

其中一个最好的部分是,您可以在模块中增加
Import::Push
行,这将在运行时定义其所有类。

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

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

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


    class dogs extends animals{

    }

    class cats extends animals{

    }
现在。。。当您需要使用类
dogs
时,您需要PHP自动加载它的父类(这样做时,您可以确定它还会解析同一文件中的所有扩展类),因此您只需编写:

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

我想你稍微误解了这个问题,我不是问php是否会猜测文件的位置或名称,我想问的是,我是否设置了自动加载,以加载一个名为与类相同的文件,然后调用与该类位于同一文件中的类,因为它只是扩展了该类,并且没有自己的名称。我建议您还可以查看文件命名约定的Pear/Zend编码标准,因为它提供了一些很好的指导原则。IMHO,在文件名中使用.class.php是多余的,不受鼓励。您可以使用如下方式自动加载:require(str_replace(“”),DIRECTORY_SEPARATOR,$className);以使其易于组织。顺便说一句,对于代码可维护性而言,每个文件有多个类通常被认为是不好的做法。哈哈,对所有的注释表示抱歉,但仅供参考,我上面的“require”行语法不正确。应该是:require(str_replace(“_',DIRECTORY_SEPARATOR,$className)。“.php”);应该对我的注释进行单元测试;)这是一个不错的解决方案,但请在此处查看更高级的PSR-4标准,它是相同方法的扩展:
    class animals{
        static function load(){
            return true;
        }
    }


    class dogs extends animals{

    }

    class cats extends animals{

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