spl_autoload可以放在另一个文件中


Can spl_autoload be placed in another file?

我目前正在用PHP制作我的第一个网站。我希望创建一个具有一般自动加载功能的文件,而不是为每个单独的页面编写自动加载。

这是我autoloadControl.php

// nullify any existing autoloads
spl_autoload_register(null,false);
//specify extensions that may be loaded
spl_autoload_extensions('.php. .class.php');
function regularLoader($className){
    $file = $className.'.php';
    include $file;
}
//register the loader function
spl_autoload_register('regularLoader');

这是我index.php文件:

require("header.php");
require("autoloadControl.php");
$dbConnection = new dbControl();
$row=$dbConnection->getLatestEntry();

目前,$dbConnection = new dbControl()给我以下错误:

致命错误:"dbControl"类

所以我的问题是,有没有办法以这种方式使用自动加载,或者我必须将其放在我编写的每个使用另一个文件的 PHP 文件的顶部?

spl_autoload放在外部文件中既有效,也是使代码更易于维护的好做法 - 在一个地方更改可能是 10、20 或更多。

您提供的代码中似乎未提供您的dbControl类。 假设您在引用类之前包含该类,并且该类工作正常,那么完成此任务应该没有问题。

require("header.php"); 
require("autoloadControl.php");  
$dbConnection = new dbControl(); // Where is this class located?

以下是适用于autoloadControl.php文件的 OOP 方法:

<?php
class Loader
{    
    public static function registerAutoload()
    {
        return spl_autoload_register(array(__CLASS__, 'includeClass'));
    }
    public static function unregisterAutoload()
    {
        return spl_autoload_unregister(array(__CLASS__, 'includeClass'));
    }
    public static function registerExtensions()
    {
        return spl_autoload_extensions('.php. .class.php'); 
    }
    public static function includeClass($class)
    {
        require(PATH . '/' . strtr($class, '_''', '//') . '.php');
    }
}
?>

您的问题与您定义回调的位置无关,而与定义回调的方式有关。

使用 spl_autoload_extensions('.php') 可以实现与自定义回调相同的目的;如果您的回调如此简单,则不需要两者。您的注释也是错误的 - 调用不带参数的spl_autoload_register不会清除当前回调,但会注册默认回调。

但是,在您的代码中,您指定了不正确spl_autoload_extensions参数 - 它应该是逗号分隔的扩展列表。所以我认为你想要的是这个:

// Tell default autoloader to look for class_name.php and class_name.class.php
spl_autoload_extensions('.php,.class.php')
// Register default autoloader
spl_autoload_register();
// READY!

这与你的代码的主要区别在于,默认的自动加载器将查找"dbcontrol.php"(全部小写),而你的自动加载器将查找"dbControl.php"(PHP代码中提到的大小写)。无论哪种方式,您当然都不需要两者。