Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Poprawne includowanie plików
404
post
Post #1





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

Ostrzeżenie: (0%)
-----


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

Ten post edytował 404 23.05.2011, 00:10:09
Go to the top of the page
+Quote Post
kiler129
post
Post #2





Grupa: Zarejestrowani
Postów: 566
Pomógł: 35
Dołączył: 21.06.2006

Ostrzeżenie: (0%)
-----


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


--------------------
flexiCMS v2 [|||||||+--] 75% done
Go to the top of the page
+Quote Post
CuteOne
post
Post #3





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
404
post
Post #4





Grupa: Zarejestrowani
Postów: 226
Pomógł: 25
Dołączył: 22.05.2011

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował 404 23.05.2011, 13:32:42
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 06:43