我偶然发现了以前从未在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 / 我只需要在应用程序的一个partivular点上使用这个库,因此只想在需要时包含它,目前我想将它包含在我的模型类的子代中。
答案 0 :(得分:16)
首先,您需要了解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
的子目录。它并没有神奇地确定库在文件系统中的位置;将它放在可以找到它的地方是你的工作。
答案 1 :(得分:7)
为了更好地理解include_path
是什么和不是什么,请阅读php.ini手册的this section。
如果您正在尝试编写特定于项目的“自动加载器”,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);
答案 2 :(得分: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';
上述方法运行良好,并继续正确包含应用程序所需的其他文件。
答案 3 :(得分:0)
John,我认为你的第二个例子失败的原因是'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()调用之后。