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


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

是否有一个技巧来运行php脚本,如果它是在一个不同的目录,而不是它当前所在的目录?

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

<<h2>上下文/h2>

文件结构:

| 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'; ?>

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

然而,

如果我用XMLHttpRequest脚本从index.php调用fragment/import.php,它就不能再找到function.php了,因为当前的工作目录现在已经改为fragment/,它正在寻找fragment/function/function.php

我目前在每个片段/文件中使用chdir()来导航回基本目录。但是我的强迫症感觉很刺痛。

// 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文档,没有标题。也许有一种方法可以设置在XMLHttpRequest中使用setRequestHeader(),但我找不到它。

TLDR;

能否有一个技巧,使脚本内的片段/认为他们是在同一个工作目录下的index.php ?或者,是否可以使用XMLHttpRequest头做一些事情来让脚本知道我希望它在哪个目录中运行?

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

欢迎任何提示和建议。感谢您的宝贵时间。

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

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

在这里阅读更多文档