spl_autoload可以放在另一个文件中吗?

时间:2012-08-08 16:30:46

标签: php

我目前正在使用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文件的顶部?

2 个答案:

答案 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代码中提到的情况)。无论哪种方式,你当然不需要两者。