12

我偶然发现了两个我以前从未在 php 中使用过的函数

set_include_path();
get_include_path();

我目前正在寻找将 phpseclib 实现到我正在处理的项目中。因为我需要使用 SSH2 的 SFTP 类扩展,而这又需要 MathBigInteger 类。等等。

该手册说set_include_path()

"在脚本运行期间设置 include_path 配置选项。"

这对我的框架的其余部分意味着什么,它会设置“phpseclib”目录中的所有包含路径吗?

另外,我真的不明白:

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

我将 php sec 存储在我的文件系统中的自定义库目录中,get_include_path() 是否在我的文件系统中神奇地找到了 phpseclib 目录?

如您所见,我在这里完全迷失了……有人可以为我提供一些启示吗?

PS/我只在应用程序的一个特定点需要这个库,因此只想在需要时包含它,目前我想将它包含在我的模型类的子类中。

4

4 回答 4

17

首先,您需要了解include_path配置设置的作用:

指定 require、include、fopen()、file()、readfile() 和 file_get_contents() 函数查找文件的目录列表。格式类似于系统的 PATH 环境变量:在 Unix 中用冒号分隔的目录列表,在 Windows 中用分号分隔。

在查找要包含的文件时,PHP 会分别考虑包含路径中的每个条目。它将检查第一个路径,如果找不到,则检查下一个路径,直到找到包含的文件或返回警告或错误。您可以在运行时使用 set_include_path() 修改或设置包含路径。

构造

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

phpseclib当您请求包含具有上述功能之一的文件时,附加到搜索的目录列表中。

由于phpseclib是相对路径,所以效果与您指定的一样./phpseclib,即 PHP 将查找phpseclib进程当前目录内命名的子目录。它不会神奇地确定库在文件系统中的位置;把它放在可以找到的地方是你的工作。

于 2013-01-12T16:32:32.233 回答
7

要更好地理解什么include_path是什么,什么不是,请阅读php.ini 手册的这一部分

如果您正在尝试编写特定于项目的“自动加载器”,set_include_path则不是最好的工具(您可能想要查看spl_autoload_register),而是回答您的问题:

set_include_path确实会覆盖以前include_path的内容。可以使用PATH_SEPARATOR常量作为分隔符提供多个路径,例如:

set_include_path($path1. PATH_SEPARATOR . $path2 . PATH_SEPARATOR . $path3);

因此您可以添加到已经存在的路径而不是像这样覆盖它:

set_include_path(get_include_path() . PATH_SEPARATOR . $mypath);
于 2013-01-12T16:34:28.127 回答
1

set_include_path 只是为 PHP 引擎设置一个可能的位置来查找文件。例如:

set_include_path( WEBROOT_PRIVATE.'scripts\phpseclib' );
if(include('Net/SSH2.php')){
    echo 'pass';
} else {
    echo 'fail';
}
include WEBROOT_PRIVATE.'application/global_function_list.php';

上述工作非常好,并继续正确包含应用程序所需的其他文件。

于 2013-01-12T16:31:01.177 回答
0

约翰,我认为您的第二个示例失败的原因是“phpseclib”没有指定完整路径。假设您的第一个示例有效,您需要替换

set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');

set_include_path(get_include_path() . PATH_SEPARATOR . WEBROOT_PRIVATE.'scripts\phpseclib');

在第二个例子中。要确认您的 include_path 是您认为应该的,您可以添加该行

echo get_include_path() . " is my include path.\n";

在 set_include_path() 调用之后。

于 2014-03-04T16:59:56.600 回答