3

我正在使用spl_autoload_register以加载类。

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

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

但后来,在 中index.php,我包含了另一个文件,work.php以执行某些特定任务。

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

如果我spl_autoload_register再次调用 in 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 部分失败......

4

2 回答 2

5

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

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

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

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

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

感谢您的回答,抱歉。

于 2012-06-22T09:03:52.590 回答
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.php,Myclass.class.php等的文件中。

于 2012-06-20T10:32:47.917 回答