PHP自动加载器类从两个或三个不同的路径加载文件

差距

我正在学习使用php autuoloader...
据我了解,我们可以使用__autoloaderspl_autoloader_*自动加载文件。
假设这是我的目录结构:

ROOT
  |
  |
  ADMIN
  |  |
  |  |
  |  DIST
  |     |
  |     SOME_FOLDER
  |     SOME_FOLDER
  |  TPL
  |     |
  |     |
  |     SOME_FOLDER1
  |           |
  |           test.php
  |     SOME_FOLDER2
  |           |
  |           example1.php
  |           example2.php
  |           example3.php
  |
  |
  CLASSES
       |
       basics.php
       class1.php
       class2.php
       class3.php
       class4.php
  |
  index.php


我在CLASSES目录basics.php中创建了此类用于自动加载文件的类

class MyAutoLoader
{

    public function __construct()
    {

            spl_autoload_register( array($this, 'load') );

    }




    function load( $file )
    {
        //spl_autoload( 'load1' );

        echo 'Try to call  ' . $file . '.php inside ' . __METHOD__ . '<br>';

        require( $file . '.php' );

    }

}

并且index.php我将包括basics.php,一切都很好,因为文件存储在CLASSES文件夹中...

require_once("CLASSES/basics.php");
$loaderObject = new MyAutoLoader();


使用此代码,我可以声明class1 ... class3
现在我想拥有一个可以装载文件的autoloder,SOME_FOLDER2在这种情况下是example1.phpexample2.php并且example3.php

在某些情况下我尝试过,但是SOME_FOLDER2不会使用autoloader装载文件。

我的尝试:

我做了一个load2MyAutoLoader类中命名的函数,试图包含来自SOME_FOLDER2

function load2( $file )
{
    //spl_autoload_register('load2');

    echo 'Inside LOADER2 ' . __METHOD__ . '<br>';

    require (  'ADMIN/TPL/' . $file . '.php' );

}



我改变spl_autoload_registerMyAutoLoader构造函数:

$allMethods = get_class_methods( 'MyAutoLoader' );
$allMethods = array_splice( $allMethods, 1 );

foreach( $allMethods as $method )
{

    spl_autoload_register( array($this, $method) );

}

但是它们都不对我

有用...您能告诉我我的代码有什么问题还是我对自动加载器的误解是什么?

Thanks in Advance

Mikk3lRo

我认为您的问题基本上可以归结为在查看文件之前不检查文件是否存在require...如果您尝试包含的第一个文件夹中不存在该文件,则会产生致命错误。

我不知道您的用例,但是这里有一些建议:

您可以只使用一个自动装带器吗?

function my_autoload($class_name) {
    if (is_file('CLASSES/' . $class_name . '.php')) {
        require_once 'CLASSES/' . $class_name . '.php';
    } else if (is_file('ADMIN/TPL/SOME_FOLDER2/' . $class_name . '.php')) {
        require_once 'ADMIN/TPL/SOME_FOLDER2/' . $class_name . '.php';
    }
}
spl_autoload_register("my_autoload");

或者,如果您需要独立声明它们(即两个或多个自动加载器):

function classes_autoload($class_name) {
    if (is_file('CLASSES/' . $class_name . '.php')) {
        require_once 'CLASSES/' . $class_name . '.php';
    }
}
spl_autoload_register("classes_autoload");

function admin_autoload($class_name) {
    if (is_file('ADMIN/TPL/SOME_FOLDER2/' . $class_name . '.php')) {
        require_once 'ADMIN/TPL/SOME_FOLDER2/' . $class_name . '.php';
    }
}
spl_autoload_register("admin_autoload");

或者使您的自动加载器类通用:

class MyAutoLoader {
    private $path;
    public function __construct($path) {
       $this->path = $path;
       spl_autoload_register( array($this, 'load') );
    }

    function load( $file ) {
        if (is_file($this->path . '/' . $file . '.php')) {
            require_once( $this->path . '/' . $file . '.php' );
        }
    }
}
$autoloader_classes = new MyAutoLoader('CLASSES');
$autoloader_admin = new MyAutoLoader('ADMIN/TPL/SOME_FOLDER2');

如果您不想手动保持ADMIN/TPL最新的子文件夹列表,您甚至可以执行以下操作从其中的任何一个自动加载(显然,这假定ADMIN/TPL包含类的所有子文件夹):

function my_autoload($class_name) {
    if (is_file('CLASSES/' . $class_name . '.php')) {
        require_once 'CLASSES/' . $class_name . '.php';
    } else {
        $matching_files = glob('ADMIN/TPL/*/' . $class_name . '.php');
        if (count($matching_files) === 1) {
            require_once $matching_files[0];
        } else if (count($matching_files) === 0) {
            trigger_error('Could not find class ' . $class_name . '!', E_USER_ERROR);
        } else {
            trigger_error('More than one possible match found for class ' . $class_name . '!', E_USER_ERROR);
        }
    }
}
spl_autoload_register("my_autoload");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular 路由器延迟加载:以相同路径开头的两个不同模块

来自分类Dev

加载时自动检查三个单选按钮

来自分类Dev

如何使用三个js加载gltf文件

来自分类Dev

三个JS:获取多个文件加载的进度

来自分类Dev

绘制两个主成分得分向量,使用不同的颜色表示三个唯一的类

来自分类Dev

根据键值比较两个不同布局的文件并将输出提取到第三个文件

来自分类Dev

一个简单的 PHP 单元测试的自动加载文件不起作用

来自分类Dev

使用不同的按钮加载两个不同的 geojson 文件

来自分类Dev

如何将相同程序集的两个版本从两个不同的子文件夹加载到两个不同的域中?

来自分类Dev

创建三个类而不是两个类-库keras

来自分类Dev

如何在PHP中使用空格将文本文件中的两个或三个单词匹配

来自分类Dev

如何自动加载文件名与类名不同的类?

来自分类Dev

在第三个 div 中显示的两个 div 的自动方程

来自分类Dev

Angular - 与同一路径的子路径关联的两个不同的延迟加载模块

来自分类Dev

加载两个DLL

来自分类Dev

加载两个DLL

来自分类Dev

sha256哈希函数中三个字节中的两个不同

来自分类Dev

将两个不同数组的元素合并到第三个数组

来自分类Dev

转储并在两个不同的文件中加载莳萝(腌)

来自分类Dev

UOW +存储库+ Autofac加载两个不同的DbContext

来自分类Dev

如何比较两个Excel文件并使用Python编写第三个文件?

来自分类Dev

PHP-修改变量加载两个不同的simpleXML url的值

来自分类Dev

Java从类路径加载文件与文件系统,哪个更好?

来自分类Dev

为什么我不能按顺序在一个文件中初始化两个静态类变量,而不能初始化三个?

来自分类Dev

使用单个控制器控制两个Partials时未加载Angular CSS文件

来自分类Dev

Google Chrome浏览器不会加载两个CSS文件

来自分类Dev

比较两个csv文件中的列并将结果写入第三个

来自分类Dev

两个活动之间的android加载圈(旋转器)

来自分类Dev

两个屏幕之间的加载指示器GWT

Related 相关文章

  1. 1

    Angular 路由器延迟加载:以相同路径开头的两个不同模块

  2. 2

    加载时自动检查三个单选按钮

  3. 3

    如何使用三个js加载gltf文件

  4. 4

    三个JS:获取多个文件加载的进度

  5. 5

    绘制两个主成分得分向量,使用不同的颜色表示三个唯一的类

  6. 6

    根据键值比较两个不同布局的文件并将输出提取到第三个文件

  7. 7

    一个简单的 PHP 单元测试的自动加载文件不起作用

  8. 8

    使用不同的按钮加载两个不同的 geojson 文件

  9. 9

    如何将相同程序集的两个版本从两个不同的子文件夹加载到两个不同的域中?

  10. 10

    创建三个类而不是两个类-库keras

  11. 11

    如何在PHP中使用空格将文本文件中的两个或三个单词匹配

  12. 12

    如何自动加载文件名与类名不同的类?

  13. 13

    在第三个 div 中显示的两个 div 的自动方程

  14. 14

    Angular - 与同一路径的子路径关联的两个不同的延迟加载模块

  15. 15

    加载两个DLL

  16. 16

    加载两个DLL

  17. 17

    sha256哈希函数中三个字节中的两个不同

  18. 18

    将两个不同数组的元素合并到第三个数组

  19. 19

    转储并在两个不同的文件中加载莳萝(腌)

  20. 20

    UOW +存储库+ Autofac加载两个不同的DbContext

  21. 21

    如何比较两个Excel文件并使用Python编写第三个文件?

  22. 22

    PHP-修改变量加载两个不同的simpleXML url的值

  23. 23

    Java从类路径加载文件与文件系统,哪个更好?

  24. 24

    为什么我不能按顺序在一个文件中初始化两个静态类变量,而不能初始化三个?

  25. 25

    使用单个控制器控制两个Partials时未加载Angular CSS文件

  26. 26

    Google Chrome浏览器不会加载两个CSS文件

  27. 27

    比较两个csv文件中的列并将结果写入第三个

  28. 28

    两个活动之间的android加载圈(旋转器)

  29. 29

    两个屏幕之间的加载指示器GWT

热门标签

归档