我正在尝试将几个php脚本转换为使用__autoload函数。目前,我可以像这样使用include和require函数:
require_once('path/to/script.php');
但是在__autoload函数内,我无法使用上面的代码。我必须使用以下代码:
require_once('absolute/path/to/script.php');
为什么似乎__autoload函数没有使用我在php.ini中指定的include路径?
我正在尝试将几个php脚本转换为使用__autoload函数。目前,我可以像这样使用include和require函数:
require_once('path/to/script.php');
但是在__autoload函数内,我无法使用上面的代码。我必须使用以下代码:
require_once('absolute/path/to/script.php');
__autoload
... 它有一些缺点(包括限制每次执行只能使用一个)。如果你使用的是5.2+版本,请使用spl_autoload_register
代替。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);
将其“添加”到你的路径中。这样做可以使得使用你的自动加载器进行测试变得更加容易(在我看来)。require 'foo/bar.php';
时,很难知道到底导入了哪个文件。我更喜欢在文件集的开头定义绝对路径define('PATH_ROOT', dirname(__FILE__));
,然后在该目录下定义所有其他有用的路径(PATH_LIBRARIES
,PATH_TEMPLATES
等)。这样,一切都被绝对定义...不需要处理相对路径(就像你现在遇到的问题)...没有看到整个设置,不确定。我的自动加载函数在全局函数文件中,看起来像这样:
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请求都通过它传递。
似乎您的包含路径中没有.
,请使用以下代码添加:
set_include_path('.' . PATH_SEPARATOR . get_include_path());
现在PHP也应该相对于执行脚本的目录进行查找了。 (这里执行的脚本类似于index.php
,而不是autoload.php
。
但是为什么不直接使用普通的相对路径,例如./path/to/class.php
呢?
.
。.
是相对于当前文件的工作目录(换句话说,它等同于 dirname(__FILE__)
)... 这就是为什么它在一个文件中可以正常工作,而在另一个文件中却不行(因为它们之间的相对工作目录发生了变化)... - ircmaxell我怀疑您的__autoload()
函数在调用它的代码所在的文件中是分开的。包含文件的路径将相对于声明__autoload()
函数的文件。
echo get_include_path();
的输出结果好吗?唯一我能想到的情况是您的包含路径中没有.
。 - NikiC