我“需要”一个有自己的 require() 调用的文件。但是调用 set_include_path() 不适用于 require() 中的相对路径。不幸的是,我无法控制所需的代码文件。
C:/myapp/index.php - 我的代码
set_include_path(get_include_path() . ';C:/app/subfolder');
require('C:/app/subfolder/index.php');
Run Code Online (Sandbox Code Playgroud)
C:/app/subfolder/index.php - 第三方代码(无控制)
require('../config.php'); // Require file located at C:/app/config.php
Run Code Online (Sandbox Code Playgroud)
结果:
无法打开所需的 '../config.php' (include_path='.;C:/app/subfolder')
即使 C:/app/subfolder 在包含路径中,这也不起作用。我希望 ../config.php 是 C:/app/subfolder/../config.php。也许我没有正确地做到这一点。
在这种情况下, C:/app/subfolder/index.php 最初从未打算包含到另一个 PHP 文件中。但是,我正在它前面构建代码,并且我希望 C:/app/subfolder/index.php 仍然能够要求/包含文件,就好像它从未离开过它的位置一样。
我读过使用 dirname() 或 __DIR__ 修复了 require() 中的相对路径问题,但我无法更改 C:/app/subfolder/index.php 中的代码。
有没有办法使这项工作?
set_include_path()
你的问题与范围无关。您的致命错误include_path
也显示为实际错误,您可以在其中看到添加的路径。
问题是该../
调用不查看include_path
,而是查看当前工作目录。这可能很难理解通过 HTTP URL 调用脚本,但如果可以通过命令行调用脚本就会更清楚。
如果您在以下位置编写此脚本/usr/angelina/myproject/subfolder/index.php
(注意:在这个解释性示例中,我将使用 Unix filePath/commands):
set_include_path( '/usr/angelina/myproject/subfolder' );
require '../config.php';
Run Code Online (Sandbox Code Playgroud)
然后,在终端中编写:
cd /usr/angelina/myproject/subfolder
php index.php
Run Code Online (Sandbox Code Playgroud)
该脚本将正常执行。但如果你写:
cd /usr/angelina/myproject
php subfolder/index.php
Run Code Online (Sandbox Code Playgroud)
即使在您调用的同一脚本中设置了包含路径,该脚本也会失败。
上面的例子解释了你的问题不是包含路径,而是当前工作目录。要解决您的问题,您必须使用chdir()
.
所以,C:/myapp/index.php
你必须写:
chdir( 'C:/app/subfolder' );
require 'C:/app/subfolder/index.php';
Run Code Online (Sandbox Code Playgroud)
你的脚本会起作用(或者,至少:在我这边它起作用了......)