2013-01-12 3 views
11

я наткнулся на две функций я никогда ранее не использовался в PHPset_include_path (get_include_path(). PATH_SEPARATOR. 'Phpseclib');

set_include_path(); 
get_include_path(); 

Я в настоящее время ищу, чтобы реализовать phpseclib на проект я работаю .. Как я должен использовать расширение класса SFTP из SSH2, который, в свою очередь, требует класс MathBigInteger .. и т.д. и т.п.

руководство говорит о set_include_path():

«Установка параметров конфигурации include_path для длительности сценария.»

Что это значит для остальной части моего фреймворка, будет ли он устанавливать ВСЕ включенные пути из каталога «phpseclib»?

Кроме того, я действительно не понимаю:

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

Я хранящее PHP сек в пользовательском каталоге библиотеки в моей файловой системе, делает get_include_path(), как некоторые магически найти каталог phpseclib в моей файловой системе ?

Как вы можете видеть, я полностью потерялся здесь. Может ли кто-нибудь быть любезным, чтобы пролить свет на меня, пожалуйста?

PS/ Мне нужна эта библиотека только в одной части часового пояса приложения, поэтому я хочу включить ее только в случае необходимости, в настоящее время я хочу включить ее в дочерний элемент моего класса модели.

ответ

15

Прежде всего, вы должны понимать, что установка include_path конфигурация делает:

Определяет список каталогов, где требуется, включают, FOPEN(), файл(), 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 внутри текущего каталога процесса. Это не волшебным образом определяет, где находится библиотека в файловой системе; это ваша задача поместить его туда, где он будет найден.

+0

спасибо, это была совершенно новая концепция для меня, но теперь имеет гораздо больше смысла. – John

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'; 

Вышеприведенное работает отлично и продолжает правильно включать другие файлы, необходимые для приложения.

7

Чтобы лучше понять, что такое include_path, есть и нет, прочитайте this section руководства пользователя 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); 
+1

Спасибо. Php ... никогда не заканчивается! – John

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().

Смежные вопросы