【问题标题】:Autoloader for OOP project面向 OOP 项目的自动加载程序
【发布时间】:2023-03-29 13:41:01
【问题描述】:

我目前正忙于一个大型 WordPress 插件,它由几个类和接口组成(使用正确的命名空间)。根据研究以及我从以前的问题中得到的答案,最好的选择是使用接口注入(依赖注入)来维护 SOC。在这个阶段,一切都按预期工作。

我现在需要将所有内容整合到一个主类中,该主类将用作控制器。此时,为了测试所有内容,我使用require_once 来加载我的类和接口(文件位于名为functions 的文件夹中)

示例:

require_once( '/functions/INTERFACEA.php' );
require_once( '/functions/CLASSA.php'     );
require_once( '/functions/INTERFACEB.php' );
require_once( '/functions/CLASSB.php'     );
//etc

我听说过自动加载器,但不完全了解如何在控制器类中使用它们。我真正需要避免的一个问题是类在其接口之前加载,因为如果加载顺序错误,我会收到一个致命错误,指出我的接口不存在。

我的问题:

如何正确使用控制器类中的自动加载器来加载我的类和接口,同时确保我的接口在它们各自的类之前加载

【问题讨论】:

  • 如果你使用命名空间,你可以简单地把东西放在相应的文件夹\Goosen\interfaces\InterfaceA\Goosen\interfaces\InterfaceB\Goosen\classes\ClassA等,然后把它们放在lib/goosen/interfaces/InterfaceA.php。在您的自动加载器中,您可以简单地检查当前尝试自动加载的类是否属于“Goosen”命名空间,然后您就会知道路径。 “这也确保我的接口在它们各自的类之前加载”这不是必需的 - 自动加载器也会处理其他类,包括依赖项。

标签: php oop autoloader


【解决方案1】:

你可以使用spl_autoload_register

// Defining autoloader
spl_autoload_register(function ($class_name) {

    // just make sure here that $class_name is correct file name
    // and there is $class_name.php file if no the fix it 
    // E.G. use strtoupper etc.
    $class_name = strtoupper($class_name);

    require_once( '/functions/'.$class_name.'.php' );
});

// Then simply use 
$class = new CLASSA();
// if `CLASSA` implements `INTERFACEA` here php 
// will autoload `INTERFACEA.php` and `CLASSA.php` 

查看这篇文章了解更多信息:http://php.net/manual/en/language.oop5.autoload.php

【讨论】:

  • 感谢您的回答,会玩这个
【解决方案2】:

使用composer 自动加载您的类。它支持自动加载的命名空间,一旦设置,一切都将在它们自己的命名空间中自动进行。

设置 composer.json 所需要做的一切

"autoload": {
        "psr-4": {"Acme\\": "src/"}
    }

只需要 aotoload.php,它就会管理其他一切。

require __DIR__ . '/vendor/autoload.php';

【讨论】:

  • 感谢您的回答。会玩这个
  • 请。这太棒了。您也可以使用它的包管理器功能。只需一个命令,您的项目就可以在任何地方设置。与名称空间混合时,自动加载条目有点棘手。但是一旦你到达那里,你就完成了。
  • Composer 非常适合开发环境中的任何东西,但首先依赖 3rd 方库可能不是一个好主意。当然,如果您打算分发第 3 方库,那么可以使用 composer。但我认为你应该首先使用命名空间和 spl_autoload_register。
猜你喜欢
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多