【问题标题】:set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
【发布时间】:2012-12-27 00:55:44
【问题描述】:

我偶然发现了两个我以前从未在 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/ 我只在应用程序的一个特定点需要这个库,因此只想在需要时包含它,目前我想将它包含在我的模型类的子类中。

【问题讨论】:

    标签: php ftp sftp phpseclib


    【解决方案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';
    

    以上内容运行良好,并继续正确包含应用程序所需的其他文件。

    【讨论】:

      【解决方案2】:

      首先您需要了解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 的子目录。它不会神奇地确定库在文件系统中的位置;把它放在可以找到的地方是你的工作。

      【讨论】:

      • 谢谢,这对我来说是一个全新的概念,但现在更有意义
      【解决方案3】:

      为了更好地理解 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);
      

      【讨论】:

      • 谢谢。 PHP...永无止境!
      【解决方案4】:

      约翰,我认为您的第二个示例失败的原因是“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() 调用之后。

      【讨论】:

        猜你喜欢
        • 2016-04-06
        • 2011-11-11
        • 1970-01-01
        • 1970-01-01
        • 2013-09-28
        • 1970-01-01
        • 1970-01-01
        • 2015-07-19
        • 1970-01-01
        相关资源
        最近更新 更多