3

我正在尝试将几个 php 脚本转换为使用 __autoload 函数。现在我可以使用 include 和 require 函数,如下所示:

require_once('path/to/script.php');

但是在 __autoload 函数内部,我不能使用上面的行。我必须使用这个:

require_once('absolute/path/to/script.php');

为什么 __autoload 函数似乎没有使用我在 php.ini 中指定的包含路径?

4

4 回答 4

10

不要使用__autoload...它有一些缺点(包括每次执行一次)。spl_autoload_register如果您使用的是 5.2+,请改用。

所以我通常做的是上课:

class AutoLoader {
    protected static $paths = array(
        PATH_TO_LIBRARIES,
    );
    public static function addPath($path) {
        $path = realpath($path);
        if ($path) {
            self::$paths[] = $path;
        }
    }
    public static function load($class) {
        $classPath = $class; // Do whatever logic here
        foreach (self::$paths as $path) {
            if (is_file($path . $classPath)) {
                require_once $path . $classPath;
                return;
            }
        }
    }
}
spl_autoload_register(array('AutoLoader', 'load'));

这样,如果您添加一个库集,您可以通过调用将其“添加”到您的路径中AutoLoader::AddPath($path);。这使得使用自动加载器进行测试变得更加容易(恕我直言)。

另一个注意事项。除非绝对必要,否则不要从自动加载类中抛出异常。原因是您可以安装多个自动加载器,因此如果您不知道如何加载文件,则可能存在另一个来加载它。但是如果你抛出一个异常,它会跳过另一个......

就个人而言,我不喜欢使用包含的相对路径。特别是对于多个包含目录(如 pear),当您看到require 'foo/bar.php';. 我更喜欢在文件集的开头定义绝对路径define('PATH_ROOT', dirname(__FILE__));,然后定义该目录之外的所有其他有用路径(PATH_LIBRARIES、、PATH_TEMPLATES等...)。这样,一切都是绝对定义的......并且不需要处理相对路径(就像你现在遇到的问题)......

于 2010-07-21T14:11:14.590 回答
0

不确定没有看到整个设置。我的自动加载函数在我的全局函数文件中,如下所示:

function __autoload($class) {
    if (file_exists("includes/{$class}.php")) {
        require_once("includes/{$class}.php");
    }
    /**
     * Add any additional directories to search in within an else if statement here
     */
    else {
        // handle error gracefully
    }
}

我使用相对路径,因为脚本包含在我的index.php文件中,并且所有 HTTP 请求都通过它传递。

于 2010-07-21T13:40:13.010 回答
0

我怀疑你的__autoload()函数在一个单独的文件中,然后是调用它的代码。包含文件的路径将相对于__autoload()函数声明所在的文件。

于 2010-07-21T13:43:08.057 回答
0

似乎.不在您的包含路径中。所以添加它使用:

set_include_path('.' . PATH_SEPARATOR . get_include_path());

现在 PHP 也应该与执行的脚本目录相关。(此处执行的脚本类似于index.php,而不是autoload.php.

但是为什么不简单地使用普通的相对路径./path/to/class.php呢?

于 2010-07-21T14:33:56.167 回答