PHP autoloader类从两个或三个不同路径加载文件

PHP autoloader类从两个或三个不同路径加载文件,php,autoloader,Php,Autoloader,我正在学习使用php自动加载程序。。。 据我所知,我们可以使用自动加载或spl自动加载来自动加载文件。 假设这是我的目录结构: 我为类目录中的自动加载文件创建了此类: basics.php: 使用此代码,我可以声明class1。。。三班 现在我想要一个自动加载程序,可以加载一些文件夹中的文件,在本例中是example1.php、example2.php和example3.php 我尝试了一些案例,但某些文件夹2中的文件无法使用autoloader加载。 我的尝试: 我在MyAutoLoa

我正在学习使用php自动加载程序。。。 据我所知,我们可以使用自动加载或spl自动加载来自动加载文件。 假设这是我的目录结构:

我为类目录中的自动加载文件创建了此类: basics.php:

使用此代码,我可以声明class1。。。三班 现在我想要一个自动加载程序,可以加载一些文件夹中的文件,在本例中是example1.php、example2.php和example3.php 我尝试了一些案例,但某些文件夹2中的文件无法使用autoloader加载。 我的尝试: 我在MyAutoLoader类中创建了一个名为load2的函数,该函数试图包含来自某些文件夹2的文件

但是没有一个不是为我工作的。。。 请告诉我我的代码有什么问题,或者我对auloader有什么误解?
提前感谢

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

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

你能只用一台自动装弹机吗

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

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

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

你能只用一台自动装弹机吗

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

您的问题实际上可能很简单:

您的basics.php位于文件夹类中,因此当您在basics.php中包含或需要文件时,它将从该文件夹开始

因此,如果您想包含来自ADMIN/TPL/SOME_FOLDER2的文件,实际上需要首先跳到一个级别,即要求“../ADMIN/TPL/SOME_FOLDER2/”$档案。php′

为了避免这种混淆,我建议在index.php的开头添加一个常量,如下所示:

define('BASEPATH', __DIR__);
…然后将其预先添加到所有要求和包含声明中-即:

class MyAutoLoader {
    public function __construct() {
        spl_autoload_register( array($this, 'load') );
        spl_autoload_register( array($this, 'load2') );
    }
    function load( $file ) {
        echo 'Try to call  ' . $file . '.php inside ' . __METHOD__ . '<br>';
        $classfile = BASEPATH . '/CLASSES/' . $file . '.php';
        if ( is_file( $classfile ) ) {
            require( $classfile );
        }
    }
    function load2( $file ) {
        echo 'Try to call  ' . $file . '.php inside ' . __METHOD__ . '<br>';
        $classfile = BASEPATH . '/ADMIN/TPL/SOME_FOLDER2/' . $file . '.php';
        if ( is_file( $classfile ) ) {
            require( $classfile );
        }
    }
}

您的问题实际上可能很简单:

您的basics.php位于文件夹类中,因此当您在basics.php中包含或需要文件时,它将从该文件夹开始

因此,如果您想包含来自ADMIN/TPL/SOME_FOLDER2的文件,实际上需要首先跳到一个级别,即要求“../ADMIN/TPL/SOME_FOLDER2/”$档案。php′

为了避免这种混淆,我建议在index.php的开头添加一个常量,如下所示:

define('BASEPATH', __DIR__);
…然后将其预先添加到所有要求和包含声明中-即:

class MyAutoLoader {
    public function __construct() {
        spl_autoload_register( array($this, 'load') );
        spl_autoload_register( array($this, 'load2') );
    }
    function load( $file ) {
        echo 'Try to call  ' . $file . '.php inside ' . __METHOD__ . '<br>';
        $classfile = BASEPATH . '/CLASSES/' . $file . '.php';
        if ( is_file( $classfile ) ) {
            require( $classfile );
        }
    }
    function load2( $file ) {
        echo 'Try to call  ' . $file . '.php inside ' . __METHOD__ . '<br>';
        $classfile = BASEPATH . '/ADMIN/TPL/SOME_FOLDER2/' . $file . '.php';
        if ( is_file( $classfile ) ) {
            require( $classfile );
        }
    }
}

谢谢你给我们展示了不同的解决方法。谢谢你给我们展示了不同的解决方法。参观者注意:请不要使用下面的答案。问题和答案中的整个方法都大错特错。请点击顶部的重复链接,而不是访客注意:请不要使用下面的答案。问题和答案中的整个方法都大错特错。请遵循顶部的重复链接