2013-01-12 18 views
11

mam natknął dwóch funkcji nigdy nie używany wcześniej w phpset_include_path (get_include_path(). PATH_SEPARATOR. 'Phpseclib');

set_include_path(); 
get_include_path(); 

Jestem obecnie poszukuje do wdrożenia phpseclib na projekcie pracuję nad .. Jak trzeba użyć rozszerzenia klasy SFTP z następujących SSH2 co z kolei wymaga klasę MathBigInteger .. itp itd

instrukcja mówi o set_include_path():

„Ustawia opcję konfiguracji include_path na czas trwania skryptu .”

Co to oznacza dla reszty mojego programu ramowego, czy ustawi WSZYSTKIE zawiera ścieżki z katalogu "phpseclib"?

Także, ja naprawdę nie rozumiem:

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

I 'm przechowywanie w sek PHP w niestandardowym katalogu biblioteki w moim systemie plików, nie get_include_path() jakiś magiczny sposób znaleźć katalog phpseclib w moim systemie plików ?

Jak widać jestem tutaj kompletnie zagubiony. Czy ktoś mógłby być na tyle uprzejmy, aby rzucić mi trochę światła?

PS/ Potrzebuję tej biblioteki tylko w jednym punkcie w aplikacji, dlatego chcę ją włączyć tylko w razie potrzeby, obecnie chcę ją dołączyć do dziecka z mojej klasy modelu.

Odpowiedz

15

Przede wszystkim trzeba zrozumieć, co ustawienie include_path konfiguracja robi:

Określa listę katalogów, gdzie wymagają, obejmują fopen(), plik(), readfile() i file_get_contents () funkcje szukają plików. Format jest podobny do zmiennej środowiskowej PATH systemu: lista katalogów oddzielona dwukropkiem w systemie Unix lub średnikiem w systemie Windows.

PHP traktuje każdy wpis w ścieżce dołączania osobno, szukając dla plików do uwzględnienia. Sprawdza pierwszą ścieżkę, a jeśli nie, znajdź ją, sprawdź następną ścieżkę, dopóki nie znajdzie dołączonego pliku lub nie zwróci ostrzeżenia lub błędu. Można modyfikować lub ustawiać ścieżkę zawierającą w czasie wykonywania przy użyciu set_include_path().

Konstrukt

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

dołącza phpseclib do listy katalogów przeszukiwanych kiedy proszę cię w tym pliku z jednej z powyższych funkcji.

Od phpseclib jest względna ścieżka, efekt jest taki sam, jak gdyby podano ./phpseclib, tj PHP będzie wyglądać w podkatalogu o nazwie phpseclib wewnątrz katalogu bieżącego procesu. Nie magicznie określa, gdzie znajduje się biblioteka w systemie plików; Twoim zadaniem jest umieścić go tam, gdzie zostanie znaleziony.

+0

Dziękuję, to był dla mnie zupełnie nowy pomysł, ale ma teraz o wiele więcej sensu. – John

1

Ścieżka set_include_path ustawia możliwą lokalizację dla silnika PHP w celu wyszukania plików. Na przykład:

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

Powyższe działa doskonale i nadal zawiera poprawnie inne pliki wymagane do aplikacji.

7

Aby lepiej zrozumieć, czym jest i nie jest include_path, przeczytaj this section podręcznika php.ini.

Jeśli próbujesz napisać konkretnego projektu „autoloader”, set_include_path nie jest najlepszym narzędziem do tego (warto zajrzeć do spl_autoload_register zamiast), ale aby odpowiedzieć na pytanie:

set_include_path robi nadpisać poprzedni numer include_path. Wiele ścieżek można uzyskać stosując PATH_SEPARATOR stałej jako separatora, np

set_include_path($path1. PATH_SEPARATOR . $path2 . PATH_SEPARATOR . $path3); 

ten sposób można dodać do już istniejącej ścieżki zamiast nadpisywania to tak:

set_include_path(get_include_path() . PATH_SEPARATOR . $mypath); 
+1

Dziękuję. Php ... nigdy się nie kończy! – John

0

John, myślę, że powód swojej Drugi przykład nie udaje się, że "phpseclib" nie określa pełnej ścieżki. Zakładając, że pierwszy przykład działa, co chcesz zastąpić

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

z

set_include_path(get_include_path() . PATH_SEPARATOR . WEBROOT_PRIVATE.'scripts\phpseclib'); 

w drugim przykładzie. Aby potwierdzić, że include_path jest co myślisz powinno być, można dodać linię

echo get_include_path() . " is my include path.\n"; 

tuż po set_include_path() rozmowy.