【发布时间】:2016-10-15 16:24:38
【问题描述】:
我正在开发一个 PHP 网站,在 Mac OS 中使用 Eclipse。
我想知道处理包含语句的正确方法是什么。
我有一个 php 文件,它是我的主要“lib”脚本。该文件通过包含命令访问其他文件。问题是如何引用这个子文件,因为 include 中的相对路径是基于入口点脚本,而不是当前脚本。
假设我有一个 mainlib.php 文件,它可以访问一个 sublib.php 文件。应该是这样的:
项目根: [库] 主库文件 子库文件 [子目录] entryPointB.php 入口点A.php我想把包含“sublib.php”的语句放在mainlib.php 中,所以我只能包含mainlib.php,而不是每次需要时都包含。 (在这个示例中只有两个文件,但在我的实际项目中会有更多的文件。
假设我的 mainlib.php 文件包含以下内容:
<?php include "libs/sublib.php; ?>
从EntryPointA.php调用mainlib.php时有效,但从EntryPointB调用时会失败。
如果 mainlib.php 包含:
<?php include "../libs/sublib.php; ?>
它可以在 EntryPointB.php 上工作,但在 entrypointA.php 上会失败。
我该如何解决这个问题?
我尝试或考虑过的一些可能性:
- 使用绝对路径 - 这不是一个好的解决方案,因为我每次将文件上传到生产环境时都必须更改文件。
- 在 $_SERVER['DOCUMENT_ROOT'] 前添加路径 - 在 Mac 上它返回 /Library/WebServer/Documents,但我的站点位于 UserFolder/Sites/MySiteName。
- 从
__DIR__变量获取目录 - 不起作用,因为它返回入口点文件,而不是项目根目录。 - 全局配置 - 我考虑将硬编码的根路径放在全局变量中。这个想法是在全局脚本中定义这个变量,在生产中我只需要更新这个脚本。但它仍然是同样的问题,我将如何引用这个脚本而不遇到路径问题?
【问题讨论】:
-
这就是为什么会有诸如环境配置(还有 vagrant / docker 等)这样的概念,以便您可以处理这些差异(或者在虚拟化的情况下,只是没有它们)。
-
你检查过这个
<?php include "/libs/sublib.php; ?>吗? -
@RisulIslam 恐怕会成功的可能性为零。 (尤其是因为语法错误。)
-
@axiac
__DIR__的问题在于它会返回入口点文件,而不是项目根目录。我实际上已将该选项放在我的问题中,但 SO 格式将其更改为 DIR,我将更新问题以正确显示。