我正在开发一个 PHP 网站,在 Mac OS 中使用 Eclipse。 我想知道处理 include 语句的正确方法是什么。
我有一个 php 文件,它是我的主要“lib”脚本。该文件通过 include 命令访问其他文件。问题是如何引用这些子文件,因为 include 中的相对路径基于入口点脚本,而不是当前脚本。
假设我有一个 mainlib.php 文件,它访问 sublib.php 文件。大概是这样的:
Project Root:
[libs]
mainlib.php
sublib.php
[subdir]
entryPointB.php
entrypointA.php
我想将 include "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 上失败。
我该如何解决这个问题?我尝试或想到的一些可能性:
__DIR__
变量获取目录 - 不起作用,因为它返回入口点文件,而不是项目根目录。我解决了这个问题。不知道这是否是最好的方法,但它解决了我。如果有人有同样的问题,我会把它留在这里。
我创建了一个名为 config.php 的文件,其中包含以下内容:
<?php define("ROOT_PATH", "/Path/to/My/Project/"); ?>
然后,我mainLib.php中可以有这句话:
include "config.php";
无论入口点脚本位于何处,它都会起作用,因为这将始终指向当前文件的同一目录,而不是入口点。 然后我只需将 ROOT_PATH 添加到其他包含:
inclue ROOT_PATH."/subdir/file.php";
假设项目有这样的树路径:
<root>
|
some_r_.php
inc_B.php
|
+\subA
|
some_A.php
inc_A.php
+\subB
|
some_B.php
假设 some_r.php、some_A.php 和 some_B.php 是可能的入口点,并且它们都还包含 \subA\inc_A.php。 另外,inc_A.php 包括inc_B.php。 在这种情况下,
__DIR__
将指向不同的子目录,具体取决于所使用的入口点(some_r、someA或some_B),使得难以将__DIR__
用作根目录。
为了解决这个问题,我在每个程序开始时使用:
if (!defined('BASEDIR')) {define('BASEDIR',__DIR__.DIRECTORY_SEPARATOR.<relative to the base> );}
并使用此常量来格式化包含路径,如下所示: 包括 BASEDIR.'subB/inc_B.php';
然后,对于本例中的每个程序:
some_r.php
if (!defined('BASEDIR')) {define('BASEDIR',__DIR__.DIRECTORY_SEPARATOR);}
include_once BASEDIR.'subA/inc_A.php';
include_once BASEDIR.'inc_B.php';
some_A.php
if (!defined('BASEDIR')) {define('BASEDIR',__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);}
include_once BASEDIR.'subA/inc_A.php';
include_once BASEDIR.'inc_B.php';
some_B.php
if (!defined('BASEDIR')) {define('BASEDIR',__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);}
include_once BASEDIR.'subA/inc_A.php';
include_once BASEDIR.'inc_B.php';
inc_A.php
if (!defined('BASEDIR')) {define('BASEDIR',__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR);}
include_once BASEDIR.'inc_B.php';