PHP和路径-相对于文件,不包括代码

PHP和路径-相对于文件,不包括代码,php,Php,我真的对PHP和path系统感到困惑 我有这样的结构: - Includes - Login - View * Secure 这些都是我网站上的目录。现在,如果我将文件放在“查看”文件夹中,我可以通过以下方式访问Includes文件夹中的文件: "../Includes/file.php" 如果我希望包含来自安全目录的相同文件,我将执行以下操作: "../../Includes/file.php" 这一切都很好,但这对我来说是个棘手的问题 如果我尝试导入的文件(Includes目录中

我真的对PHP和path系统感到困惑

我有这样的结构:

- Includes
- Login
- View
   * Secure
这些都是我网站上的目录。现在,如果我将文件放在“查看”文件夹中,我可以通过以下方式访问Includes文件夹中的文件:

"../Includes/file.php"
如果我希望包含来自安全目录的相同文件,我将执行以下操作:

"../../Includes/file.php"
这一切都很好,但这对我来说是个棘手的问题

如果我尝试导入的文件(Includes目录中的file.php)也包含一个文件,那么它将抛出所有内容。假设该文件将在“Login”中包含一个文件,则它必须是这两个包含中的一个,所有这一切取决于包含它的代码是否位于Secure或View目录中:

"../Login/file.php" -> if it was included from the View directory
"../../Login/file.php" -> if it was included from the Secure directory.
显然,这个问题只会越来越严重。也许我想要的是一种让路径相对于文件本身而不是包含代码的方法


另一方面,我想我真正想要的是如何处理所有这些,包括PHP中的“地狱”?我觉得我把我的结构紧紧地绑在一起,如果一切都不打破,我就无法改变很多。因此,任何关于如何处理这一问题的建议都是非常值得赞赏的。

有两种路径:相对路径和绝对路径。绝对路径以
/..
开头(或
C:/..
或在Windows上工作的方式),并始终明确指向一个特定文件

相对路径(不以
/
开头)与
include_path
变量相对。这是一个包含一组文件夹的变量,PHP将在其中查找您的相对路径。该
include_path
还包括当前目录
。“当前”目录取决于“第一个”要执行的文件。因此,这取决于哪个文件开始包含其他文件

  • 您可以访问某个特定的、不变的目录,因此您总是有一个相对固定的路径来包含
  • 更好:构建绝对路径:

    include __DIR__ . '/../Login/file.php';
    
    这总是相对于文件所在的目录


  • 因此,您实际上会建议构造绝对路径,即使一个明显的缺点是文件之间的耦合度较高?此外,DIR本身并不是一个可行的解决方案,因为它不是从网站的web目录开始的,它会进一步向上-此外,我想你会因为缺少格式而否决我的问题。我将在将来纠正这一点。如果还有其他原因,请告诉我。你不能既有蛋糕又吃通过设置
    include\u path
    ,这些路径要么相对于固定根,要么使用
    \uu DIR\uu
    彼此相对。无论哪种方式,如果您更改目录结构,都必须编辑一堆文件为了避免这种情况,您应该使用类和自动加载;虽然这仍然意味着,如果更改目录结构,您将编辑一组名称空间名称。但是这两个名称空间对大型项目来说不是都是一个糟糕的环境吗?如果将其设置为相对于include_路径,则必须(据我所知)为每个脚本设置include_路径。如果我以后决定更改它,我需要检查每个文件并更改它。再说一次,如果我使用DIR,会有一个很大的问题,它不是从网站目录开始的,它会走得更远。例如,在localhost上,DIR将是“Applications/MAMP/htdocs/mySite”,而不仅仅是“mySite”。您肯定不会在每个文件中都包含
    set\u include\u path
    。您可以将其包含在核心
    php.ini
    中,或者在特定站点的Apache配置中包含一个php配置指令,或者理想情况下,您应该有一些公共引导文件,所有请求都可以通过该文件。是的,
    \uuuuuu DIR\uuuuuu
    指的是它所写入的文件的目录,因此它是一个定义的开始点来写入相对路径。如果重命名文件,无论哪种方式都会有问题,根本没有办法解决。谢谢你的帮助。我相信我缺少的是引导文件。我所有的请求都会通过一个文件,这样我就可以在那里进行一些基本的设置。我将尝试了解更多。非常感谢。