2012-05-03 13 views
13

Byłem w Internecie, próbując znaleźć najlepszy sposób na obsługę ścieżek na mojej stronie. Czy powinienem używać ścieżek względnych, ścieżek bezwzględnych?Najlepsza praktyka dla ścieżek PHP

Dowiedziałem się kilkakrotnie dirname (FILE). Jednym z problemów, z jakimi mam do czynienia w przypadku ścieżek względnych, jest to, że pliki php dołączane przez kilka innych plików na różnych poziomach katalogów powodują przerwanie ścieżek względnych. Na przykład jeśli struktura katalogów jest

Root 
    A 
    B 
     b 

i plik php w B i zawierać inny plik od B, wówczas w stosunku do ścieżki kodu w pliku w B będą różne.

Przepraszam, jeśli to jest mylące, mam trudności z napisaniem tego, co próbuję powiedzieć.

Zasadniczo, jaki jest najlepszy sposób obsługi ścieżek do plików w odniesieniu do operacji umieszczania i operacji w kodzie.

Thank You

+0

To jest problem z "najlepszym" wszystkim, prawie zawsze jest subiektywny. –

Odpowiedz

0

Można umieścić wszystkie swoje zawierać pliki do jednego katalogu głównego. Następnie utwórz zmienną ścieżki w pliku konfiguracyjnym lub w samym skrypcie, który wskazuje katalog zawierający.

+0

To by działało, ale łamie moją organizację. Próbuję zachować moje pliki w logicznej strukturze katalogów, ponieważ jest ich tak wiele. – Nath5

-1

Nowa wersja php (PHP5.3) jest możliwa do użycia pod numerem __autoload . Wystarczy określić katalog główny aplikacji.

+0

Czy autoload skanuje ścieżkę do katalogu rekurencyjnie, a jeśli ma to negatywny wpływ na wydajność. Wydaje się również, że autoload działa tylko dla klas, niektóre z moich plików nie są OO. – Nath5

0

Najlepszym sposobem korzystania z odpowiednich konwencji nazewnictwa dla struktury katalogów, pliki PHP i nazwy klasy pliku i autorskiego projektu układu automatycznego ładowania dołączyć plik

+0

Czy masz dobre linki do przykładów tworzenia i autoloadera? Jestem całkiem nowym użytkownikiem php i nie znalazłem jeszcze dobrego samouczka. – Nath5

+0

http://php.net/manual/en/language.oop5.autoload.php –

+0

Dziękuję, przeczytałem, ale to wydaje się działać tylko dla OO, niektóre z moich plików nie są OO, więc domyślam się, że ta metoda wygrała ' t działa. – Nath5

10

Tho istnieje wiele sposobów, aby dowiedzieć się ścieżkę zawsze najłatwiej zdefiniować stałą w pliku w katalogu głównym projektu index.php lub sortowania według rodzaju. następnie mogę użyć SITE_ROOT dla załączników/ładowarek klasy ect, i SITE_URL dla widoków, kontrolerów, przekierowań ect.

<?php 
$root=pathinfo($_SERVER['SCRIPT_FILENAME']); 
define ('BASE_FOLDER', basename($root['dirname'])); 
define ('SITE_ROOT', realpath(dirname(__FILE__))); 
define ('SITE_URL', 'http://'.$_SERVER['HTTP_HOST'].'/'.BASE_FOLDER); 
?> 

Basic class Autoloader

<?php 
function __autoload($class_name) { 
    include (SITE_ROOT.'/includes/'.$class_name.'.php'); 
} 
$obj = new MyClass1(); 
$obj2 = new MyClass2(); 
?> 
+0

W tej metodzie nie wszystkie pliki, które będą używać autoloadera, muszą zawierać plik konfiguracyjny. JEŚLI tak jest najlepszym sposobem, aby to zrobić przy użyciu względnej ścieżki jak include ("../../ config.php"); Podobnie jak wspomniałem wyżej, czy to zadziała, jeśli nie wszystkie pliki są OO – Nath5

+0

definiują stałe w pliku indeksu, to po prostu musi wskazywać na twój katalog główny, jeśli twoja konfiguracja jest w katalogu głównym, wszystko czego potrzebujesz to "include" (SITE_ROOT '/ config.php') 'niezależnie od tego, jak głęboka jest twoja nazwa, to zawsze będzie wskazywać na ten sam plik. '__autoload' działa tylko podczas wywoływania klas, oszczędza na wykonywaniu' include (SITE_ROOT. '/ includes /'.$ class_name.'. php '); 'dla każdej klasy, bardzo przydatna dla modeli w wzorcu MVC jako kontroler jest zwykle wywoływana z klasy kontrolera routera/kontrolera przedniego –

+2

Nie bardzo rozumiem, jak to rozwiązuje mój problem. Nawet jeśli mam ten poziom konfiguracji w moim katalogu głównym, to nadal musi on być dołączony przy użyciu względnych ścieżek przez wszystkie inne moje pliki. Przykładem problemów, które mam, jest to, że mam klasę ErrorReporter dołączoną do wszystkich innych moich plików, które znajdują się na różnych poziomach w strukturze katalogów. Wewnątrz klasy ErrorReporter mam kilka ścieżek, ale jeśli są względne, stają się względne w stosunku do dowolnej klasy, w tym ErrorReporter, co oznacza, że ​​nie są one względem tego samego miejsca za każdym razem. – Nath5

0

Zend Framework ma kilka dobrych wskazówek na temat optymalizacji obejmują ścieżki:

http://framework.zend.com/manual/1.10/en/performance.classloading.html

Nawet jeśli nie jesteś przy użyciu Zend Framework, te są dobrymi wskaźnikami. Ogólne bulletpoints są:

  • Użyj ścieżki bezwzględne
  • Zmniejszenie liczby obejmują ścieżki można zdefiniować
  • Zdefiniuj bieżący katalog ostatni, albo wcale
  • Zdefiniuj Zend Framework include_path jak najwcześniej (niezbyt istotne, jeśli nie używasz Zend)