Daniel Częstki

Daniel Częstki senior php developer

Temat: Includowanie plików z różnych poziomów.

Witam. CHodzi mi po głowie uniwersalne rozwiązanie na problem związany z includowaniem plików w PHP w taki sposób, aby było to niezależne od położenia tych plików.

przyjmijmy taka sytuacje:

+public_html
| +-common
| | +- plik.php
| | +- plik1.php
| |
| +-index.php

index.php
---------
include "common/plik.php"

common/plik.php
---------------
include "plik1.php"

Wywolanie index.php spowoduje oczywisty błąd, gdyż PHP będzie szukał pliku plik1.php w katalogu public_html, ponieważ bieżąca ścieżka (katalog) jest tą, na którą wskazuje pierwszy z kolejnosci parsowany plik php, czyli index.php (katalog:public_html).
Aby temu zaradzić najłatwiej jest dołożyć katalog 'common' do include_path poprzez ini_set.

Czy ta metoda jest najbardziej optymalna ?
Generalnie chodzi mi o taki przypadek iż, jeżeli tworze jakiś moduł - załóżmy 'newsletter', ktory korzysta z jakichś zewnętrznych klas (np. PEAR DB, czy PHPMailer) to lepiej ściśle wiązać położenie tych klas z modułem, czy raczej umozliwic dowolna lokalizacje tych klas + zmiana sciezek include_path, a w samym module includowac po prostu glowne pliki klas (np. include "DB.php" czy include "PHPMailer.php" bez wskazywania katalogow ?

Jakie są wasze doświadczenia w tym temacie ?Daniel C. edytował(a) ten post dnia 11.04.08 o godzinie 17:29
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Includowanie plików z różnych poziomów.

U mnie wygląda to tak:

class/
lib/
module/
...

itp.

class - Klasy stworzone przeze mnie, obsługują modele (wewnątrz dowolna struktura katalogów)
lib - Oprogramowanie firm/osób trzecich
module - moduły i kontrolery

do include_path mam dodane m.in.:
./class/;./lib/;./module/;

Dodatkowo korzystam z autoloadera w Zend Framework, a nazwy klas nadaje wg konwencji przyjętej przez Zenda (link poniżej). Każda klasa jednoznacznie wyznacza swoje położenie poprzez swoją nazwę. Tym sposobem mam porządek w katalogach a includowaniem się nie martwię. Jeśli potrzeba jakiś obiekt - to autoloader sam go załaduje.

Konwencje nazewnictwa klas w Zend FrameworkPrzemek Szalko edytował(a) ten post dnia 11.04.08 o godzinie 17:42

Temat: Includowanie plików z różnych poziomów.

Im większe drzewo podczas includowania z include_path interpreter php ma do przeszukania, tym siłą rzeczy działa wolniej.

Jeśli includujesz pliki należące do jednej biblioteki/strony/aplikacji to zdecydowanie lepiej robić to uwzględniając strukturę katalogową, nie poprzez include_path.

include_path jest przydatny na przykład w momencie użycia w aplikacji biblioteki która leży gdzie indziej.

Dobrym rozwiązaniem jest trzymanie bibliotek zewnętrznych (np. AdoDB, Smarty) w zupełnie oddzielnej ścieżce niż aplikacje, które ich używają. Pierwszą zaletą jest jeden update biblioteki dla wszystkich aktualizacji (w skrajnych przypadkach może to być wadą). Poza tym nie dublujesz kodu niepotrzebnie na dysku, no i na przykład autor owej biblioteki może ją dalej rozwijać, nie martwiąc się, że ktoś zrobił sobie kopie i jej nie zaktualizuje (ta ostatnia zaleta sprawdza się w przypadku bibliotek "korporacyjnych", kiedy jedna osoba rozwija daną bibliotekę, a wiele innych korzysta z niej w swoich aplikacjach. Nie mam tutaj na myśli środowiska Open Source.)
Michał C.

Michał C. Deputy Head of
Software Development

Temat: Includowanie plików z różnych poziomów.

U siebie korzystam z __autoload() na podstawie mapy plikow. Przy pierwszym urucomieniu na podstawie definicji w pliku xml jest tworzona mapa plikow.
Natomiast w wersji produkcyjnej wszystkie klasy, ktore wchodza w sklad mojego fw, takie jak kontrolery, sterowniki bd, itp. sa scalane do jednego duzego pliku i tylko raz includowane :)

konto usunięte

Temat: Includowanie plików z różnych poziomów.

Michał Mańko:
include_path jest przydatny na przykład w momencie użycia w aplikacji biblioteki która leży gdzie indziej.

Warto to stosować gdy chcemy nadpisać sobie bibliotekę np. CacheLite z PEAR.
Przemek Szalko

Przemek Szalko iOS Developer + Full
Stack Developer

Temat: Includowanie plików z różnych poziomów.

Michał Czerwiński:
U siebie korzystam z __autoload() na podstawie mapy plikow. Przy pierwszym urucomieniu na podstawie definicji w pliku xml jest tworzona mapa plikow.
Natomiast w wersji produkcyjnej wszystkie klasy, ktore wchodza w sklad mojego fw, takie jak kontrolery, sterowniki bd, itp. sa scalane do jednego duzego pliku i tylko raz includowane :)

To działa szybciej niż zwykłe includowanie?
A co jak dany kontroler/sterownik/model nie jest potrzebny? Przygotowujesz jedną wersję super-mega-big-package-to-include, czy może dla każdego kontrolera osobny small-but-efficient-super-package-to-include?:-)
Michał C.

Michał C. Deputy Head of
Software Development

Temat: Includowanie plików z różnych poziomów.

Działa szybciej, poniewaz wczytuje tylko jeden plik zamiast 20 :)
A i do tej paczki wrzucane sa tylko te pliki, które są uzywane przez dany projekt :)
Dodatkowo ten mega plik jest parsowany i usuwane sa wszystkie nie potrzebne spacje, komentarze itp., co znacząco zmiejsza rozmiar pliku :)

konto usunięte

Temat: Includowanie plików z różnych poziomów.

Struktura nazewnictwa klas i plików zgodna z "konwencją Zenda" pomaga utrzymać porządek i w pewnym sensie daje unikalność nazw (przy braku namespace'ów) choć daleko jeszcze do dostępu "pakietowego". Przy złych wiatrach nazwa klasy staje się dłuższa niż ekran panoramiczny ;)

Co do wczytywania "potrzebnych" plików to nie wyobrażam sobie korzystania z jakiejkolwiek biblioteki czy frameworka FC/MVC bez autoloadu + include_path + plików konfiguracyjnych przechowujących m.in. podstawowe ścieżki dyskowe używane przez aplikację.

Polecam na początek zobaczyć jak to robi się w "Zend Framework"
http://framework.zend.com/manual/en/zend.loader.html
http://framework.zend.com/manual/en/zend.controller.mo...
Kamil Szot

Kamil Szot PHP, JavaScript -
rozwiązywanie
problemów.
limeline.pl

Temat: Includowanie plików z różnych poziomów.

ja osobiście robię:

common/plik.php
---------------
include dirname(__FILE__)."/plik1.php"

Następna dyskusja:

Cachowanie, includowanie, k...




Wyślij zaproszenie do