set_include_path() 不适用于相对 require()

Joe*_*Joe 5 php

我“需要”一个有自己的 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 中的代码

有没有办法使这项工作?

fus*_*n3k 4

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)

你的脚本会起作用(或者,至少:在我这边它起作用了......)