如何嵌套,相对包括工作?

时间:2013-05-30 15:35:45

标签: php phpseclib php-include

我正在使用第三方php库(phpseclib),其中包含包含其他文件的文件。它似乎只有当我将它安装在我包含第一个文件的任何目录的“根目录”时才能工作。如果我把它放在一个子文件夹中,那么phpseclib文件中的include会变得无法找到其他文件,尽管它们是相对的!

这可行(直接在我的文件夹中安装):

include( "File/X509.php" );

工作(将其安装在我文件夹的子文件夹中):

include( "phpseclib/File/X509.php" );

失败的是X509.php调用包含文件:

require_once('File/ASN1.php');

我知道这是因为一旦我将x509.php包含到我的脚本中,代码就会在那里执行。如果不更改包含的库中的PHP代码,有没有办法使这个工作?要使include使用相对于我安装它的路径?

实施例

假设文件结构:

/myfolder/myscript.php
/myfolder/sub/file/x509.php
/myfolder/sub/file/asn1.php

myscript.php

<?php include( "sub/file/x509.php" ); ?>

x509.php

<?php include( "file/asn1.php" ); ?>

asn1.php

<?php echo "included"; ?>

2 个答案:

答案 0 :(得分:2)

使用chdir更改当前工作目录。我还建议在执行此操作之前使用getcwd获取工作目录,然后在完成后更改回该目录。

$cwd = getcwd();
chdir("phpseclib/");
include("File/X509.php");
chdir($cwd);

答案 1 :(得分:1)

我只需要添加这样的路径(然后重置它):

//This is so we don't screw up anything else in the PHP web app
$currentIncludePath = get_include_path();

//Need to let phpseclib know where to find its files
set_include_path( "phpseclib" . PATH_SEPARATOR . $currentIncludePath );

//Now include the file(s)
include( "phpseclib/File/X509.php" );

//Now set back to normal
set_include_path( $currentIncludePath );