Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dzielenie kodu na kilka plików
Forum PHP.pl > Forum > PHP
404
Witam smile.gif

Od razu przejdę do rzeczy. Buduję stronę internetową. Dla przykładu załóżmy, że mam następujące podstrony:
Kod
http://www.moja-strona.pl/users/jan.kowalski
http://www.moja-strona.pl/projekty/hello.word
http://www.moja-strona.pl/about

Dla każdej podstrony tworzę osoby plik, który ją (tj. stronę) generuje:
Kod
dipslay_users.php
dipslay_projects.php
about.php

O co mi chodzi?
Chciałbym móc zrobić coś takiego:
  1. //Plik: index.php?s=[nazwa_strony]
  2.  
  3. // Połączenie z bazą danych
  4. // Inicjalizacja sesji
  5. // ...
  6.  
  7. $site = $_GET['s'];
  8. switch($site)
  9. {
  10. case 'users': require_once('display_users.php'); break;
  11. case 'projects': require_once('display_projects.php'); break;
  12. case 'about': require_once('display_about.php'); break;
  13. }
  14.  
  15. // Zamknięcie połączenia z bazą
  16. // Itp.

Mówiąc krótko - wszystkie strony mają "przechodzić" przez jeden plik oraz zmiennych użytych w pliku index.php chciałbym móc używać w pozostałych plikach. Czy muszę do tego użyć global, tzn. czy to muszę być zmienne globalne? Czy może ma ktoś inny pomysł? Inną koncepcję? smile.gif

Używam silniczka szablonów (RainTPL) (gdyby komuś ta informacja była potrzebna).
szmerak
Cytat
zmiennych użytych w pliku index.php chciałbym móc używać w pozostałych plikach

Tego nie rozumiem...

Skoro masz pętle switch i w danym momencie przeglądasz userów, czyli includujesz display_users...
To po co ci używać tych zmiennych na podstronie about jak jej nie parsujesz(przeglądasz)?

Jeśli ktoś przełączy na about to index zacznie się parsować od początku i "będziesz mógł używać zmiennych z indexu".

...
A jeśli chcesz używać ich w plikach które nie przechodzą przez index to jest to bezsensu i nie do wykonania (bo index nie jest parsowany)(ale o to pewnie ci nie chodzi)

Ogólnie najlepszym przykładem dla ciebie będzie CMS PHP FUSION i plik maincore.php... zobacz sobie jak to jest tam rozwiązane i jaką role ten plik odgrywa...

Pozdrawiam i mam nadzieje że o to ci chodziło... bo nie zrozumiałem do końca
404
Dziękuję za zainteresowanie moim problemem - już tłumaczę smile.gif

Cytat
Skoro masz pętle switch i w danym momencie przeglądasz userów, czyli includujesz display_users...
To po co ci używać tych zmiennych na podstronie about?

Głównie chodzi o to, aby zaoszczędzić sobie pisania w każdym pliku tego samego fragmentu kodu. Na przykład sesja. Obiekt reprezentujący sesję chciałbym utworzyć/powołać do życia tylko raz (w pliku index.php):
  1. // Plik: index.php
  2.  
  3. // Połączenie z bazą danych
  4.  
  5. // Inicjalizacja sesji
  6. // Session object.
  7. $session = new Session($db);
  8.  
  9. // Session.
  10. if( !$session->created() )
  11. $session->create();
  12.  
  13. $session->initialization();
  14.  
  15. if( !$session->isGuest() )
  16. $session->update();
  17.  
  18. // ...
  19.  
  20. $site = $_GET['s'];
  21. switch($site)
  22. {
  23. //...
  24. }

Utworzyć tylko raz, ale posługiwać się nim chciałbym np. w pliku display_users.php
  1. // Plik: display_users.php
  2.  
  3. if( $session->something() ) // `$session` - obiekt, który został powołany do życia w pliku index.php
  4. {
  5. //...
  6. }

Powiedzmy, że część profilu użytkownika jest dostępna tylko dla zalogowanych - wtedy będzie mi potrzebna sesja w pliku display_users.php smile.gif

Cytat
A jeśli chcesz używać ich w plikach które nie przechodzą przez index(...)

Nie no - to jest nie logiczne i bezsensu smile.gif Tak robić NIE chcę smile.gif

Cytat
Ogólnie najlepszym przykładem dla ciebie będzie CMS PHP FUSION(...)

Przeglądałem PHPBB - tam wszędzie używają global, ale luknę do PHP FUSION smile.gif

Mam nadzieję, że rozjaśniłem trochę smile.gif
szmerak
Hmm, Ja tylko nie rozumiem czy ktoś jeszcze?

Skoro powołujesz do życia obiekt Session() w pliku index a później includujesz display_users.php do tego samego pliku, to w czym problem?
Zoobrazuje ci to

  1. +++++PLIK INDEX.PHP+++++
  2. <?php
  3. $session = new Session();
  4. itp. itd..
  5. ...
  6. ..
  7. ...
  8. switch($_GET['page']){
  9. case 'display_users':
  10. include 'display_users.php';
  11. +++++++++++++++++++++
  12. /* TUTAJ PARSOWANIE INDEXU JEST ZATRZYMYWANE, ZOSTAJE DOŁĄCZONY PLIK DISPLAY_USERS, WZNAWIANE JEST PARSOWANIE PLIKU WRAZ Z KODEM Z PLIKU DISPLAY_USERS (Zaczynając od miejsca przerwania). <- Tak więc obiekt $session <- jest dostępny w pliku display_users */
  13. +++++++++++++++++++++
  14. break;
  15. }
  16. ...
  17. ...
  18. ...
  19. //reszta kodu
  20. $template->parse();
  21. ?>

no i żadne global nie jest tutaj potrzebne...
404
No jak na złość - kiedy chciałem zrobić malutki test padł mi XAMPP tongue.gif Musiałem zainstalować go ponownie tongue.gif No, ale przynajmniej teraz mam aktualną wersję smile.gif

Wracając do tematu - Twój kod działa - o coś takiego mi chodzi smile.gif Przyznam się bez bicia, że testowałem ten sposób kiedyś jednak z negatywnym rezultatem. Zapewne coś schrzaniłem smile.gif
Pytanie tylko teraz - czy takie rozwiązania się stosuje? Czy są one praktykowane?
Zastanawiam się też - include_once, czy require_once? Wiem, że jedna funkcja wypluwa warning, a druga fatal error. Czy jest jeszcze coś o czym powinienem wiedzieć stosując te funkcje przy takim rozwiązaniu? smile.gif
szmerak
Cytat(404 @ 2.01.2012, 23:42:13 ) *
Pytanie tylko teraz - czy takie rozwiązania się stosuje? Czy są one praktykowane?

Podałem ci przykład pliku PHP Fusion z maincore.php, który jest includowany na samej górze prawie każdego pliku w tym CMSie, zawiera on szereg funkcji które są najczęściej używane...
ale przed funkcjami są sprawdzane i ustawiane "w przypadku FUSIONA" stałe... (czy użytkownik zalogowany, konfiguracje itp...), includowane pliki itd.. <- (Tak jak ty chciałeś)
W taki oto sposób wszystkie najważniejsze zmienne są dostępne prawie w każdym pliku...
Tak więc jak najbardziej jest to praktykowane, potwierdza to np Fusion...

Cytat
Zastanawiam się też - include_once, czy require_once? Wiem, że jedna funkcja wypluwa warning, a druga fatal error.

Jak zapewne wiesz są 4 rodzaje funkcji dołączających(includujących).
include, include_once, require, require_once.
include a require różni się tym że w przypadku nie znalezienia pliku, include wypluwa błąd ale skrypt jest wykonywany do końca.
Jeśli chodzi o require to parser wypluwa błąd i skrypt zostaje przerwany w miejscu błędu.(Wolałem to napisać dla późniejszych niejasności)
no i jeszcze jest _once wsumie jak sama nazwa wskazuje "once -> raz" czyli w tłumaczeniu "dołącz ale tylko raz" to znaczy że jeśli plik już był dołączony to funkcja z "_once" jest pomijana.

A teraz require czy include?
Powiem ci to na moim przykładzie.
Wszystkie pliki z niezbędnymi funkcjami, konfiguracją, klasami(np. mysql) bez których strona nie może działać, require.
Mniej ważne pliki includuje. Czyli takie które nie wpłyną tak bardzo na stronę jak brak połączenia MySQL czy inne...

Cytat
Czy jest jeszcze coś o czym powinienem wiedzieć stosując te funkcje przy takim rozwiązaniu?

Tak, ponieważ funkcja include jeśli nie umiejętnie się nią posługujesz ciągnie za sobą pewne zagrożenia typu. File inclusion...
Ale ja nie znam się na tym zabardzo dlatego prosił bym kogoś bardziej wtajemniczonego o wypowiedzenie się w tym temacie.

Pozdrawiam!
by_ikar
Cytat(404 @ 2.01.2012, 21:42:03 ) *
Przeglądałem PHPBB - tam wszędzie używają global, ale luknę do PHP FUSION smile.gif


Tam też wszędzie używają global - normalna praktyka w przypadku średnich lotów cmsów proceduralnych. Żeby nie używać globala musiałbyś za każdym razem przekazywać zmienną jako argument. Jak w przypadku jednej funkcji może wyglądać to nie za ciekawie, tak w przypadku obiektów, wygląda to znacznie lepiej.

Odnośnie include czy require, IMO tylko require. Wolę żeby aplikacja przestała działać, niż ma działać z jakimiś błędami (brak szablonu itp).
szmerak
@by_ikar
tylko że mi się wydaję że chodziło mu o takie coś
  1. Plik index.php
  2. <?
  3. $zmienna = "asdads"
  4. kod...
  5. kod...
  6. kod...
  7. include 'plik.php';
  8. ?>

  1. Plik plik.php
  2. <?
  3. global $zmienna; <- aby mógł jej używać w tym pliku(coś jak extern w C++), ale wiadomo że jest to błędne. (wyjaśniłem to 4 posty wyżej dlaczego)
  4. ..kod..
  5. ..kod..
  6. ..kod..
  7. ?>


Pozdrawiam wink.gif

A co do includa i requira -> czy nie lepiej na jakiegoś trackera który pracuje w tle ale jest dołączany na początku użyć include? ponieważ w przypadku błędu cała strona padnie, a używając includa, my stracimy troche statów, ale użytkownicy tego nie odczują.
by_ikar
Cytat
A co do includa i requira -> czy nie lepiej na jakiegoś trackera który pracuje w tle ale jest dołączany na początku użyć include? ponieważ w przypadku błędu cała strona padnie, a używając includa, my stracimy troche statów, ale użytkownicy tego nie odczują.


To że coś się nie wczytało z plików php, jest raczej sytuacją wyjątkową, która miejsca mieć nie powinna. Czyli przerwanie działania skryptu i stosowna informacja dla admina + logi. A co jeżeli operowałeś na danych które dostarczał nie zaincludowany plik? Jest błąd, nawet jeżeli to jest notice, to skrypt IMO powinien zostać przerwany i zapisać do logów stosowną informację. Nie pamiętam kiedy ostatni raz użyłem include i bardzo dobrze mi z tym. Przynajmniej mam kontrolę nad aplikacją, a nie że ona robi sobie co chce wink.gif
404
Dziękuję bardzo za odpowiedzi - teraz wszystko jest jasne i przejrzyste smile.gif
Pozdrawiam! smile.gif
viking
A może skoro i tak potrzebujesz zadania które osiągasz dzięki dowolnym frameworkom MVC zainteresujesz się jakimś? Kohana, Yii, Zend Framework. Bo z tego co widać po kodzie zaczynasz powoli zmierzać w tym kierunku.
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.