spl_autoload_register无法在包含的文件中工作

时间:2012-06-20 10:21:51

标签: php autoload

我正在使用spl_autoload_register来加载类。

我有一个包含index.php文件的init.php文件。 spl_autoload_register函数在init.php文件中调用。

index.php文件中,它可以正常工作:我可以创建类和东西,它们的名称已经解析。

但是稍后,在index.php中,我添加了另一个文件work.php来执行某项特定任务。

奇怪的是,在work.php中,找不到我正在使用的课程。

如果我在spl_autoload_register再次拨打work.php,则可以解析该课程。

真正奇怪的是,这种行为并不一致:在我的测试服务器上,我不必复制spl_autoload_register调用,但在我的生产服务器上,这是强制性的。

我是否遗漏了php.ini中的一些选项?

修改/更新:以下是init.php文件中的内容,以防万一:

<?php
function my_autoload($class){
    include 'class/' . $class . '.class.php';
}

spl_autoload_register('my_autoload');
?>

我的index.php:

<?php
require_once 'include/init.php';

$barcode = new Barcode();
// here is a bunch of test and stuff
include 'work.php';
?>

我的work.php:

<?php
$myObj = new Barcode();
// more useles stuff
?>

条形码在index.php代码部分完美创建,但在work.php部分失败...

2 个答案:

答案 0 :(得分:5)

嗯,实际上,我是个笨蛋。问题不在于包含路径等,而是使用apache配置:MultiViews。

我的网站有一个访问点:index.php。我使用url重写重定向它上面的所有内容。但是由于多视图选项,如果网址与文件名相同,则网址重写无法正常工作。

我的目录包含index.php和work.php。

我重写的脚本是这样的:如果你点击www.mywebsite.com/work,你可以使用param url = work继续index.php。 index.php初始化所有内容,然后包括work.php

但是多亏了MultiViews选项,如果我正在访问www.mywebsite.com/work,它会搜索文件,找到work.php,然后直接调用它。含义:没有init,意思是:没有spl_autoload_register。

感谢您的回答,抱歉。

答案 1 :(得分:4)

检查include_path设置是否包含本地目录。

通常,使用相对路径不是一个好主意。可以很容易地创建一个与init.php文件相关的绝对路径,如下所示:

function my_autoload($class){
    include __DIR__.'/class/' . $class . '.class.php';
}

此代码假定您的init.php文件与“class”文件夹位于同一文件夹中。

此外,不是在盲目地包含给定路径中可能存在或不存在的文件的情况下创建错误,而是在包含文件之前检查文件是否存在:

function my_autoload($class){
    $file = __DIR__.'/class/' . $class . '.class.php';
    if(file_exists($file)) {
       include $file;
    }
}

请注意__DIR__是PHP 5.3的功能,在PHP 5.2的主机上不可用。您可以使用dirname(__FILE__)

替换它

此外,请注意在Linux上以区分大小写的方式搜索文件,在大多数Mac OS X安装中,整个文件都是不区分大小写的。如果您实例化类MyClass,Linux将查找MyClass.class.php,而Mac OS X也会加载该类,如果它位于名为myclass.class.phpMyclass.class.php等的文件中