我目前正在使用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文件的顶部?
答案 0 :(得分:0)
将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');
}
}
?>
答案 1 :(得分:0)
您的问题与您定义回调的位置无关,而是如何。
使用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代码中提到的情况)。无论哪种方式,你当然不需要两者。