我目前正在用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代码中提到的大小写)。无论哪种方式,您当然都不需要两者。