我正在“要求”一个文件,该文件有自己的 require() 调用。但是调用 set_include_path() 并不适用于 require() 中的相对路径。不幸的是,我无法控制所需的代码文件。
C:/myapp/index.php - 我的代码
set_include_path(get_include_path() . ';C:/app/subfolder');
require('C:/app/subfolder/index.php');
C:/app/subfolder/index.php - 第三方代码(无控制)
require('../config.php'); // Require file located at C:/app/config.php
结果:
打开失败需要'../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 仍然能够 require/include 文件,就好像它从未离开过它的位置一样。
我读过使用 dirname() 或 __DIR__ 修复了 require() 中的相对路径问题,但我无法更改 C:/app/subfolder/index.php 中的代码。 p>
有没有办法让它工作?
最佳答案
您的问题与 set_include_path()
scope 无关。您的 fatal error 也显示了实际的 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' );
然后,在终端中,你写:
cd /usr/angelina/myproject/subfolder
php index.php
脚本将被正常执行。但是如果你写:
cd /usr/angelina/myproject
php subfolder/index.php
脚本将失败,即使在您调用的同一脚本中设置了包含路径也是如此。
上面的例子说明你的问题不是包含路径,而是当前工作目录。要解决您的问题,您必须使用 chdir()
更改当前目录。
所以,在 C:/myapp/index.php
中你必须写:
chdir( 'C:/app/subfolder' );
require( 'C:/app/subfolder/index.php' );
并且您的脚本会起作用(或者,至少:在我这边它起作用了...)
关于php - set_include_path() 不适用于相对 require(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35909247/