【问题标题】:How get nested, relative includes to work?如何嵌套,相对包含工作?
【发布时间】:2013-05-30 15:35:44
【问题描述】:

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

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

include( "File/X509.php" );

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

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

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

require_once('File/ASN1.php');

我知道会发生这种情况,因为一旦我将 x509.php 包含到我的脚本中,代码就会在那里执行。在不更改包含库中的 PHP 代码的情况下,有什么方法可以使它工作吗?要使包含使用相对于我安装位置的路径?

示例:

假设一个文件结构:

/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"; ?>

【问题讨论】:

  • 请给出返回的错误,并更正include中的错字,以免被人投诉。
  • @BorisGuéry 我修正了错别字并在下面发布了答案。
  • @bestprogrammerintheworld 为什么?我的回答实际上使它起作用。
  • 唐,很好的解决方案!我对那个投了赞成票!:-)
  • @bestprogrammerintheworld 谢谢,PHP 中总有解决方案! ;)

标签: php phpseclib php-include


【解决方案1】:

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

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

【讨论】:

  • 这不会解决问题。如果 file.php 在子文件夹中包含任何内容,它仍然不会找到它(因为该子文件夹不是包含搜索路径的一部分)。请参阅下面的答案。
  • 如果你包含一个相对于你在这个方法中的文件的文件确实有效。不需要进入包含路径。
  • 除了,如我的问题所述,我不想更改我包含的文件。所以我可以为“file/x509.php”的包含执行此操作,但是当该文件包含另一个相关文件时,它将不起作用。
  • 我认为您最好的选择是在包含之前和之后执行 chdir。我会更新答案。
  • 我认为它们将大致等效。我建议在 phpseclib 之前添加而不是仅添加,以便它在包含路径中已经存在的任何其他内容之前解析。
【解决方案2】:

我只需要像这样添加路径(然后重新设置):

//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 );

【讨论】:

  • 如果在各种包含路径中有一个名为“model/user.php”的文件,您的方法将返回第一个匹配包含路径的包含路径,该包含路径可能是也可能不是相对于该文件的路径包含发布于。
  • @Orangepill 好点。就我而言,没有这种风险,因为phpseclib 使用我永远不会使用的文件夹名称。那么,是否有另一种解决方案(假设我不能或不想更改 phpseclib 文件中的任何内容)?
  • 设置 include_path 几乎是 PEAR 的方式,这是 phpseclib 的 CS 的基础。
猜你喜欢
  • 2016-02-03
  • 2014-11-08
  • 2020-12-04
  • 2016-03-16
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多