Подтвердить что ты не робот

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/ Мне нужна только эта библиотека в одной частичной точке приложения, поэтому я хочу включить ее только тогда, когда это необходимо, в настоящее время я хочу включить ее в дочерний элемент моего класса модели.

4b9b3361

Ответ 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().