2012-08-08 57 views
1

我目前正在用PHP创建我的第一个网站。我不想为每个单独的页面编写自动加载,而是希望创建一个具有一般自动加载功能的文件。spl_autoload可以放在另一个文件中吗?

这里是我的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()给了我以下错误:

Fatal error: Class 'dbControl'

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

+0

你可以将它放在另一个文件中,这是完全可以的,因为你需要这个文件。唯一重要的是它被执行,这就是你的代码的情况。但是你有一个配置问题。哪个文件名有'dbControl'类,哪个目录放置了所有这些文件? – hakre 2012-08-08 16:32:39

+0

你能粘贴完整的错误吗? – Florent 2012-08-08 16:34:45

回答

0

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

看来您的dbControl类没有在您提供的代码中提供。假设你在引用它之前就已经包含了这个类,并且该类可以正常工作,那么完成这个任务应该没有问题。

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

这是一个面向对象的方法为您autoloadControl.php文件:

<?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'); 
    } 
} 

?> 
+0

这回答这个问题的第一句话(虽然不是OP有问题)。其余的似乎是无关紧要的。 – IMSoP 2012-08-08 17:09:51

+0

如果有人遇到这个问题,我想澄清一下我的观点,即“Loader”类不是OOP(不包括对象,甚至包括继承/多态性),并且不会为它所基于的代码添加任何内容因为它将每行代码替换为单行函数,而单行函数仍然必须在单独的代码行中调用。 – IMSoP 2012-08-12 00:46:27

+0

如果你希望更有建设性,那么就像你推测的那样发布一个真实的例子。这个网站是为了帮助别人为自己思考,而不是告诉他们这是唯一的方式,但你必须这样做。 – RobB 2012-08-12 17:18:23

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

+0

我想出了这个问题。这是我一直忽略的一个简单的错误。感谢您的帮助。之后我也转向了OOP风格。的xD – user1243892 2012-08-08 17:42:37

相关问题