Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poprawne includowanie plików
Forum PHP.pl > Forum > PHP
404
Witam drogich forumowiczów.
Sfrustrowany i zirytowany walką z include, include_once itp. zwracam się do was.
Mój problem polega na tym, iż podzieliłem sobie kod strony na kilkanaście plików. Następnie zrobiłem sobie jeden plik o nazwie Include.php, dodałem go do głównego pliku, w którym generuję stronę i wszystko było ok. To rozwiązanie wydawało mi się... "brzydkie", więc postanowiłem to zrobić tak, jak np. robi się to w C++.

Cytat
GUI/Page.php
index.php
Hash.php

  1. <?php
  2. //index.php
  3. include_once('GUI/Page.php');
  4. echo DisplaySomething('Hello word!');
  5. ?>

  1. <?php
  2. // Page.php
  3. include_once('../Hash.php');
  4. function DisplaySomething($string)
  5. {
  6. echo Code($string);
  7. }
  8. ?>

  1. <?php
  2. // Hash.php
  3. function Code($string)
  4. {
  5. return 'code::' . $string . '::code';
  6. }
  7. ?>

Nie zgadniecie co się stało...
Cytat
Warning: include_once(../Hash.php) [function.include-once]: failed to open stream: No such file or directory in (...) on line 3
Warning: include_once() [function.include]: Failed opening '../Hash.php' for inclusion (include_path='(...)') in (...) on line 3
Fatal error: Call to undefined function Code() in (...) on line 7

Wiem co ten błąd oznacza, wiem dlaczego tak się stało, ale nie wiem, czy jest jakieś proste, optymalne i piękne rozwiązanie (np. jakaś funkcja PHP), która mi pomoże.
Macie może na to jakieś swoje sposoby, porady?
Pozdrawiam, 404
kiler129
Są 3 opcje w zasadzie:
1. include_path
2. używanie klas i spl_autoloader
3. plik config.php a w nim define("APATH", "/absolute/path"); i później includować używając tej stałej

Najlepsze byłoby #2 smile.gif
CuteOne
W jego przypadku opcja nr. 3 smile.gif nie rzucajmy chłopaka na głębokie wody...

404 twój drobny błąd polega na tym, że po zaincludowaniu pliku do pliku nadrzędnego przyjmuje jego "wartości" w twoim wypadku zamiast ../hash.php powinno być hash.php ;]

dlatego polecam lekturę o ścieżkach względnych i bezwzględnych w php
404
@kiler129:
Opcja druga odpada już na wstępie. Nie będę tworzył klasy dla każdego modułu strony (moim zdaniem, to łamie zasady OOP (chociaż czy w PHP można mówić o OOP? ;p)).
Opcja trzecia- plik config.php też by trzeba includować.

@CuteOne:
Jak już mówiłem- wiem na czym polega ten błąd wink.gif. Jednak ja chciałbym znaleźć uniwersalną metodę, która pozwoli mi includować pliki niezależnie od położenia pliku nadrzędnego. Np., gdybym miał taką sytuację:
Cytat
forum/index.php
Include/GUI/Page.php
Include/Hash.php
index.php

Zamieniłbym:
  1. include_once('../Hash.php');
na
  1. include_once('Hash.php');
to wtedy błąd by występował w pliku forum/index.php
Mam nadzieję, że piszę w miarę zrozumiale wink.gif

Na dzień dzisiejszy znalazłem takie rozwiązania:
1. (testowane na localhoscie)
  1. <?php
  2. // index.php
  3. include_once( $_SERVER['DOCUMENT_ROOT'] . '/forum.php.pl/Include/GUI/Page.php' );
  4. echo DisplaySomething('Hello word!');
  5. ?>

  1. <?php
  2. // Page.php
  3. include_once( $_SERVER['DOCUMENT_ROOT'] . '/forum.php.pl/Include/Hash.php' );
  4. function DisplaySomething($string)
  5. {
  6. echo Code($string);
  7. }
  8. ?>

  1. <?php
  2. // Hash.php
  3. function Code($string)
  4. {
  5. return 'code::' . $string . '::code';
  6. }
  7. ?>

  1. <?php
  2. // [forum] index.php
  3. include_once( $_SERVER['DOCUMENT_ROOT'] . '/forum.php.pl/Include/GUI/Page.php' );
  4. echo DisplaySomething('[forum] Hello word!');
  5. ?>

Wszystko działa tak jakbym chciał.

2.
Z set_include_path też kombinowałem. Też działało wink.gif

Dziękuję za dotychczasową pomoc wink.gif Temat zostawię jeszcze otwarty- może ktoś coś jeszcze zaproponuje wink.gif

/edit:
Wracając do set_include_path.
Najpierw zmieniałem ścieżkę tylko w pierwszym pliku, który odczytywał interpreter PHP (w powyższym przykładzie były to pliku index.php i forum/index.php) jednak to rozwiązanie wymuszało zrobienie rzeczy, które mi się nie podobały. Wpadłem na pomysł żeby set_include_path wywołać w każdym includowanym pliku. Takie rozwiązanie satysfakcjonowałoby mnie w 101%, ale przecież zawsze musi być jakieś "ale". Tym "ale" jest tutaj wydajność. Skrypt (z powyższego przykładu) wykonuje się troszeczkę dłużej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.