PHP的require_once不按照我想要的方式工作...相对路径问题

3
我遇到了将相对路径分配给require_once的问题。我确定这是我没有看到的简单问题...
文件夹目录结构 一级:站点 二级:包括 二级:类
所以... site/include/global.php <-- 这是从中调用函数autoload的地方 site/class/db.php 当我尝试使用
function__autoload($className)
{
     require_once '../class/'.$className.'.php';

}

我收到了以下内容:
警告:require_once(../class/db.php) [function.require-once]:无法打开流:没有那个文件或目录
致命错误:require_once() [function.require]:打开 '../class/db.php' 失败(include_path='.;./includes;./pear')
我做错了什么?如果我把global.php放在class文件夹中,它就能正常工作,所以我认为是我的相对路径理解不好导致的问题。
谢谢。
2个回答

10

require(_once)include(_once) 相对于第一个脚本的路径工作,即实际调用的脚本的路径。

如果您需要在已包含或已要求的文件中使用 require 并且想相对于该文件工作,可以使用

dirname(__FILE__)."/path/to/file";

正如@Arkh指出的那样,从PHP 5.3开始

__DIR__."/path/to/file";

2
太快了:(。您也可以在php5.3+中使用__DIR__ - Arkh
非常感谢!require_once dirname(FILE).'/../class/'.$className .'.php';完美运作!我不知道 require 默认从根目录开始。我假设(你永远不应该假设)它是从当前目录开始的。无论如何,感谢 Pekka。 - payling
@payling 不用谢。有一个重要的区别,我所说的“根目录”是指在浏览器中调用的脚本,而不一定是根目录。我的措辞有点误导,抱歉。我已经进行了一些编辑。 - Pekka
1
明白了。主页(调用autoload函数)位于站点目录中。 global.php页面位于我的include目录中,但由于我在主页中包含了global.php,所以它暂时在站点目录中。'class/'.$className.'.php';能够正常工作,但最好使用我们提出的第一个解决方案,即使用dirname,因为我可能会从站点目录之外的位置包含脚本,所以'class/'并不总是有效!再次感谢! - payling
没错,说得非常好!干杯。 - Pekka

0

这个能用吗(仅适用于apache,我相信

require_once($_SERVER['DOCUMENT_ROOT'] . '/class/' . $classname '.php');

我不想使用文档根目录,因为我是在远程网站上工作。我有两个版本的网站,主要网站和测试版本,网站文件夹与测试版本命名不同。如果我想让测试和主要工作正常,绝对路径将无法工作。:/ - payling
哦。不是分开的端口,只有/test和/main。这意味着你的开发环境并不是你将要部署的镜像,但我知道这种诱惑。 - Andrew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接