Ścieżki w php

Dzisiaj w rozmowie z Jarkiem, dowiedziałem się, że w pracy go poinstruowano, że powinien używać wyłącznie ścieżek względnych w php, ponieważ to o wiele bardziej bezpieczne. Nic bardziej bzdurnego….

Po pierwsze, może nie każdy wie co to ścieżki względne/bezwględne. Oto przykład:

  • względna – classes/Controller/Index.php
  • bezwzględna – /home/services/httpd/test.com/classes/Controller/Index.php

Ścieżka względna wydaje się prostsza, krótsza i wogóle mniej problemów niby. Ale kto broni zastosować Registry, w którym przechowujemy bezwzględną ścieżkę do naszej aplikacji (w tym wypadku /home/services/httpd/test.com).
Dlaczego tak bardzo sobie utrudniać życie? Ponieważ w dobie OOP w PHP5 korzystamy z klas, które są w dziesiątkach plików, każdy pik trzeba załadować.
Jeśli w naszym __autoload() korzystamy z require_once() i podamy ścieżkę nie od głównego korzenia, ale względnie, dla przykładu:

require_once(’classes/Controller/Index.php’);

to php nie sprawdza od razu bieżącego katalogu, ale najpierw dokleja przed ścieżki które mamy podane include_path. Czyli php może za każdym razem sprawdzać 5 lokalizacji zanim trafi na nasz plik. A tak może od razu ładować właściwy plik.
Wystarczy stosować ścieżki bezwględne albo dodawać informację, że ma ładować plik z bieżacej lokalizacji:

  • wersja pośrednia – ./classes/Controller/Index.php

Sprawę wydajności mamy już za sobą. A sprawa bezpieczeństwa jest chyba oczywista. Jeśli php skacze po różnych katalogach, które ma podane w include_path może wczytać podmieniony plik, a nie ten o który nam chodziło.