如何相对地(在不同的目录层级)要求PHP文件?

59

我有以下文件结构:

rootDIR
    dir1
        subdir1
           file0.php
           file1.php
    dir2
       file2.php
       file3.php
       file4.php   

file1.php需要从dir2中引用file3.phpfile4.php

require('../../dir2/file3.php')

file2.php 像这样需要 file1.php

require('../dir1/subdir1/file1.php')

但是在file1.php中,使用require无法打开file3.phpfile4.php(可能由于路径相对性引起)。

然而,为什么会出现这种情况,我应该如何处理file2.php,以便file1.php可以正确地requirefile3.phpfile4.php

5个回答

79

56

尝试在路径之前添加 dirname(__FILE__),例如:

require(dirname(__FILE__).'/../../dir2/file3.php');

应该从根目录开始包含文件


10
如果您的版本高于5.3,最好使用__DIR__,与dirname(FILE)相同,但可以避免昂贵的dirname()调用。 - Dennis Haarbrink
1
谢谢。你能告诉我“/../dir”和“../dir”的区别吗? - Boris D. Teoharov
1
在这种情况下,你使用 /../ 是因为 dirname(FILE) 返回一个字符串,例如:'/root/dir1/dir2/dir3',缺少最后的 '/',因此如果不加上它并合并两个路径,结果将变为 '/root/dir1/dir2/dir3../'。 - Baronth

8
一个可行的建议是在您的php web应用程序中避免使用"../../"相对路径。它很难阅读,维护起来也很糟糕。
  1. 正如您所证实的那样。这使得很难知道您指向的是什么。
  2. 如果您需要更改应用程序或其部分的文件夹级别。它完全容易出错,并且很可能会破坏某些难以调试的东西。
相反,首选模式是在您的引导文件中为主要路径定义一些常量,然后使用:define
require(MY_DIR.'/dir1/dir2/file3.php');

将您的应用从那里移动,就像在一个文件中替换您的MY_DIR常量一样容易。
如果您必须保持相对路径。最少要做到的是,根据相对路径引用构建绝对路径,如所接受的响应所建议的那样。但是,还要牢记命名您的../匿名中间路径的重要性,作为消除混淆或歧义的手段。

与问题无关 - Gershom Maes
1
@Gershy 在我看来,这是一个相关的答案,提供了“可行的替代方案”,并给出了“尝试这个而不是那个”的建议。并非每个答案都是直接的。不过,我已经改进了我的回答。 - hexalys

1
你可以始终使用$_SERVER['DOCUMENT_ROOT']作为有效的起点,而不是采用相对路径。这只是另一个选项。
require($_SERVER['DOCUMENT_ROOT'].'/wp-load.php');

不可在CLI或Cron中使用。 - Liam Mitchell

-4

我认为你的当前工作目录是dir2。 尝试:

require("file3.php");
require("file4.php");

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