我正在尝试将几个 php 脚本转换为使用 __autoload 函数。现在我可以使用 include 和 require 函数,如下所示:
require_once('path/to/script.php');
但是在 __autoload 函数内部,我不能使用上面的行。我必须使用这个:
require_once('absolute/path/to/script.php');
为什么 __autoload 函数似乎没有使用我在 php.ini 中指定的包含路径?
我正在尝试将几个 php 脚本转换为使用 __autoload 函数。现在我可以使用 include 和 require 函数,如下所示:
require_once('path/to/script.php');
但是在 __autoload 函数内部,我不能使用上面的行。我必须使用这个:
require_once('absolute/path/to/script.php');
为什么 __autoload 函数似乎没有使用我在 php.ini 中指定的包含路径?
不要使用__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
等...)。这样,一切都是绝对定义的......并且不需要处理相对路径(就像你现在遇到的问题)......
不确定没有看到整个设置。我的自动加载函数在我的全局函数文件中,如下所示:
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 请求都通过它传递。
我怀疑你的__autoload()
函数在一个单独的文件中,然后是调用它的代码。包含文件的路径将相对于__autoload()
函数声明所在的文件。
似乎.
不在您的包含路径中。所以添加它使用:
set_include_path('.' . PATH_SEPARATOR . get_include_path());
现在 PHP 也应该与执行的脚本目录相关。(此处执行的脚本类似于index.php
,而不是autoload.php
.
但是为什么不简单地使用普通的相对路径./path/to/class.php
呢?