执行调用的 php 脚本,就好像它与调用脚本在同一工作目录中一样

Executing a called php script as if it was in the same working directory as the calling script

是否有技巧可以 运行 设置 php 脚本,就好像它位于与当前所在目录不同的目录中一样?

我正在尝试将一个小程序的文件结构组织到对我来说具有更多语义意义的文件夹中,但在这样做时我似乎违背了 php 当前工作目录的概念.

上下文

文件结构:

| function/
|         function.php
|
| fragment/
|         import.php
|         export.php
|
| index.php

所有 php 文件都需要 function.php

<?php require_once 'function/function.php'; ?>

在 index.php 中包含片段就可以了:

<?php include 'fragment/import.php'; ?>
<?php include 'fragment/export.php'; ?>

由于 index.php 在基本工作目录中执行,他们都很高兴地找到了 function/function。php。

然而,

如果我通过使用 XMLHttpRequest 脚本从 index.php 调用它来获得 fragment/import.php,它不再能找到 function.php,因为当前工作目录现在已经更改为 fragment/ 并且它正在寻找 fragment/function/function.php

我目前在每个片段/文件中使用 chdir() 导航回基本目录。但是我的 OCD-sense 很刺痛。

// plus I have to hardcode the target directory
chdir( '/www/code/laboratory/' );

// as this makes bad things happen for the include in index.php
chdir( dirname( __dir__ );
// same as
include '../function/function.php';

简而言之,如果 .php 文件都在同一个目录中,我就不会遇到任何这些问题。更不用说程序正在调用一个脚本,该脚本必须明确告诉自己返回到调用它的目录,这让我无休止地感到厌烦,这似乎是不必要的。

这么麻烦,我一定是做错了什么。我尝试摆弄 .htaccess 文件,但没有走得太远。 RewriteRule 似乎只适用于 http 请求,而不适用于 php 包含,所以我放弃了这个想法。使用来自 html 的 标签,唉,也没有成功,因为片段不是完整的 html 文档并且没有 header。也许有一种方法可以在 XMLHttpRequest 中使用 setRequestHeader() 设置 但我找不到它。

TLDR;

将脚本放入片段中是否有技巧/认为它们与 index.php 位于同一工作目录中?或者,是否可以使用 XMLHttpRequest header 来让脚本知道我希望它进入哪个目录 运行 in ?

或者我应该 php 逻辑思考,而不是语义,并且分割我的代码是一个真正的坏主意?

欢迎任何提示和建议。谢谢你的时间。

您是否尝试添加到包含路径,其中PHP搜索包含?

$path = '/www/code/laboratory/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

Read more Documentation on that here