Set_include_path (get_include_path(). PATH_SEPARATOR. 'phpseclib');
Я наткнулся на две функции, которые я никогда раньше не использовал в php
set_include_path();
get_include_path();
В настоящее время я ищу для реализации phpseclib в проекте, над которым я работаю. Поскольку мне нужно использовать расширение класса SFTP для SSH2, которое, в свою очередь, требует класс MathBigInteger.. и т.д. и т.д.
В руководстве говорится о set_include_path()
:
"Устанавливает параметр конфигурации include_path на время script."
Что это значит для остальных моих фреймворков, будет ли он включать ВСЕ пути include из каталога phpeclib?
Кроме того, я действительно не получаю:
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
Я храню php sec в каталоге пользовательской библиотеки в своей файловой системе, а get_include_path() каким-то образом волшебным образом находит каталог phpseclib в моей файловой системе?
Как вы можете видеть, я полностью потерялся здесь. Может ли кто-нибудь быть достаточно любезен, чтобы пролить свет на меня, пожалуйста?
PS/
Мне нужна только эта библиотека в одной частичной точке приложения, поэтому я хочу включить ее только тогда, когда это необходимо, в настоящее время я хочу включить ее в дочерний элемент моего класса модели.
Ответы
Ответ 1
Прежде всего вам нужно понять, что делает настройка include_path
:
Задает список каталогов, в которых требуются, 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
внутри текущего каталога процесса. Это не волшебным образом определяет, где находится библиотека в файловой системе; это ваша работа, чтобы поместить его туда, где он будет найден.
Ответ 2
Чтобы лучше понять, что 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);
Ответ 3
Путь 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';
Вышеописанное работает отлично и продолжает правильно включать другие файлы, необходимые для приложения.
Ответ 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().