当前位置: 首页 > 面试题库 >

从不同文件夹自动加载类

艾谦
2023-03-14
问题内容

这就是我自动加载controllers文件夹中所有类的方式,

# auto load controller classes
    function __autoload($class_name) 
    {
        $filename = 'class_'.strtolower($class_name).'.php';
        $file = AP_SITE.'controllers/'.$filename;

        if (file_exists($file) == false)
        {
            return false;
        }
        include ($file);
    }

但是我的models文件夹中也有类,我也想自动加载它们-我该怎么办?我应该复制上面的自动加载并仅将路径更改为models/(但是不是重复吗?)?

谢谢。

编辑:

这些是我在控制器文件夹中的类文件名:

class_controller_base.php
class_factory.php
etc

这些是我在模型文件夹中的类文件名:

class_model_page.php
class_model_parent.php
etc

通常这就是我命名控制器类类的方式(我使用下划线和小写),

class controller_base 
{
...
}

class controller_factory
{
...
}

这通常是我为模型类类命名的方式(我使用下划线和小写),

class model_page 
    {
    ...
    }

    class model_parent
    {
    ...
    }

问题答案:

您应该命名您的类,以便将下划线(_)转换为目录分隔符(/)。一些PHP框架可以做到这一点,例如Zend和Kohana。

因此,您可以为课程命名,然后Model_Article将文件放入其中classes/model/article.php,然后自动加载就可以了…

function __autoload($class_name) 
{
    $filename = str_replace('_', DIRECTORY_SEPARATOR, strtolower($class_name)).'.php';

    $file = AP_SITE.$filename;

    if ( ! file_exists($file))
    {
        return FALSE;
    }
    include $file;
}

还要注意,您可以spl_autoload_register()使任何功能成为自动加载功能。它也更加灵活,允许您定义多个自动加载类型的函数。

如果必须有多个自动加载功能,则spl_autoload_register()允许这样做。它有效地创建了自动加载功能队列,并按照定义的顺序遍历每个功能。相反,__
autoload()只能定义一次。

编辑

注意: 自PHP 7.2.0起,__ autoload
已被弃用。强烈建议不要使用此功能。请参阅PHP文档以获取更多详细信息。http://php.net/manual/zh/function.autoload.php



 类似资料:
  • 我目前正在制作一个Minecraft Mod Loader。 正如您在上面看到的,我有一个名为Client的类。当Minecraft游戏启动时,启动被调用。现在我有一个名为Mods的文件夹,在调用startup时,我需要将Mods从Mods文件夹加载到ArrayList命名模块中。更深入地说,每个Mod将有一个继承这个模块类的主类 因此,在调用startup时,我需要遍历mods文件夹中的每个Mo

  • 如何使用作曲家自动加载从不同的文件夹获取类、特征、接口? 其中一些我使用名称空间,例如, 控制器/Foo.php, 模型/Boo。php index.php, 错误 致命错误:类'MyNamespace\Foo'中找不到C:... composer.json, 我在许多不同的文件夹中有许多类(它可能会扩展),所以当我在一个新文件夹中有新类时,有没有办法不重新安装composer autoload?

  • 我想调用helpers文件夹中的statics方法。 我已经尝试了很多tutos,但它总是只有一个文件。 我的配置/应用程序/助手/语言。php- composer.json app.php 我尝试的是: 添加自动加载类映射、HelpersServiceProviders类、命名空间(仅在刀片模板中工作,而不是在控制器中工作) 添加带或不带类映射、命名空间的自动加载psr-4 对于所有的方法,我需

  • 我需要加载不同服务器上存在的类文件,并在类文件中执行方法。我不想使用超文本传输协议或RMI,但想应用这种方法。我正在看URLClassLoader,但没有得到任何地方。有人能给我一个从不同服务器加载类的例子吗?

  • 我正在使用python 2.7. x和Boto API 2. X连接到AWS S3桶。我有一个独特的情况,我想从S3桶下载文件,从一个特定的目录/文件夹说。但问题是我想在S3文件夹中留下一个最新的文件,而不是下载它。一旦,我在我的本地框中下载这些文件,我想将这些文件移动到同一个桶下的不同文件夹说。以前有人处理过类似的情况吗? 以下是一些解释: 将下载的文件从S3存储桶移动到同一存储桶下的不同文件夹

  • 我从我的IntelliJ Java 15 Gradle项目的resources文件夹中的子文件夹加载文件时遇到问题...