我正在尝试转换几个PHP脚本以使用__autoload函数。现在我可以使用include和require这样的函数:
require_once('path/to/script.php');
但是在__autoload函数内部,我无法使用上面的行。我必须用这个:
require_once('absolute/path/to/script.php');
为什么__autoload函数似乎不使用我在php.ini中指定的包含路径?
答案 0 :(得分:9)
不要使用__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);
将其“添加”到您的路径中。这使您的自动加载器测试变得更容易(恕我直言)。
另一个注意事项。除非绝对必要,否则不要从自动加载类中抛出异常。原因是您可以安装多个自动加载器,因此如果您不知道如何加载文件,则可能存在另一个加载文件。但是如果你抛出异常,它会跳过另一个......
就个人而言,我不喜欢使用包含相对路径。特别是对于多个包含目录(如pear),当您看到require 'foo/bar.php';
时,很难确切地知道要导入哪个文件。我更喜欢在文件集define('PATH_ROOT', dirname(__FILE__));
的开头定义绝对路径,然后定义该目录之外的所有其他有用路径(PATH_LIBRARIES
,PATH_TEMPLATES
等...) 。这样,一切都是绝对定义的...而且不需要处理相对路径(就像你现在遇到的问题一样)......
答案 1 :(得分: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请求都通过它传递。
答案 2 :(得分:0)
我怀疑你的__autoload()
函数在一个单独的文件中,然后是调用它的代码。包含文件的路径将相对于__autoload()
函数声明所在的文件。
答案 3 :(得分:0)
似乎.
不在您的包含路径中。所以添加使用:
set_include_path('.' . PATH_SEPARATOR . get_include_path());
现在,PHP也应该与执行的脚本目录相关。 (此处执行的脚本类似于index.php
,而不是autoload.php
。
但为什么不使用像./path/to/class.php
这样的正常相对路径?