如何处理我的项目中的包含文件和相对路径?

问题描述 投票:0回答:2

我正在开发一个 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 上失败。

我该如何解决这个问题?我尝试或想到的一些可能性:

  • 使用绝对路径 - 这不是一个好的解决方案,因为每次将文件上传到生产环境时我都必须更改文件。
  • 在 $_SERVER['DOCUMENT_ROOT'] 前面添加路径 - 在 Mac 上它返回 /Library/WebServer/Documents,但我的网站位于 UserFolder/Sites/MySiteName 中。
  • __DIR__
    变量获取目录 - 不起作用,因为它返回入口点文件,而不是项目根目录。
  • 全局配置 - 我考虑过将硬编码的根路径放入全局变量中。这个想法是在全局脚本中定义这个变量,在生产中我只需要更新这个脚本。但它仍然是同样的问题,我如何引用这个脚本而不出现路径问题?
php macos apache
2个回答
0
投票

我解决了这个问题。不知道这是否是最好的方法,但它解决了我。如果有人有同样的问题,我会把它留在这里。

我创建了一个名为 config.php 的文件,其中包含以下内容:

<?php define("ROOT_PATH", "/Path/to/My/Project/"); ?>

然后,我mainLib.php中可以有这句话:

include "config.php";

无论入口点脚本位于何处,它都会起作用,因为这将始终指向当前文件的同一目录,而不是入口点。 然后我只需将 ROOT_PATH 添加到其他包含:

inclue ROOT_PATH."/subdir/file.php";

0
投票

假设项目有这样的树路径:

<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';
© www.soinside.com 2019 - 2024. All rights reserved.