Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Dzielenie kodu na kilka plików
404
post
Post #1





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

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


Witam (IMG:style_emoticons/default/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ę? (IMG:style_emoticons/default/smile.gif)

Używam silniczka szablonów (RainTPL) (gdyby komuś ta informacja była potrzebna).
Go to the top of the page
+Quote Post
szmerak
post
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 12
Dołączył: 23.11.2006
Skąd: WL

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


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

Ten post edytował szmerak 2.01.2012, 21:34:18
Go to the top of the page
+Quote Post
404
post
Post #3





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

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


Dziękuję za zainteresowanie moim problemem - już tłumaczę (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif) Tak robić NIE chcę (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/smile.gif)

Mam nadzieję, że rozjaśniłem trochę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
szmerak
post
Post #4





Grupa: Zarejestrowani
Postów: 286
Pomógł: 12
Dołączył: 23.11.2006
Skąd: WL

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


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

Ten post edytował szmerak 2.01.2012, 22:18:14
Go to the top of the page
+Quote Post
404
post
Post #5





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

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


No jak na złość - kiedy chciałem zrobić malutki test padł mi XAMPP (IMG:style_emoticons/default/tongue.gif) Musiałem zainstalować go ponownie (IMG:style_emoticons/default/tongue.gif) No, ale przynajmniej teraz mam aktualną wersję (IMG:style_emoticons/default/smile.gif)

Wracając do tematu - Twój kod działa - o coś takiego mi chodzi (IMG:style_emoticons/default/smile.gif) Przyznam się bez bicia, że testowałem ten sposób kiedyś jednak z negatywnym rezultatem. Zapewne coś schrzaniłem (IMG:style_emoticons/default/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? (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
szmerak
post
Post #6





Grupa: Zarejestrowani
Postów: 286
Pomógł: 12
Dołączył: 23.11.2006
Skąd: WL

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


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!

Ten post edytował szmerak 3.01.2012, 02:21:46
Go to the top of the page
+Quote Post
by_ikar
post
Post #7





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(404 @ 2.01.2012, 21:42:03 ) *
Przeglądałem PHPBB - tam wszędzie używają global, ale luknę do PHP FUSION (IMG:style_emoticons/default/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).
Go to the top of the page
+Quote Post
szmerak
post
Post #8





Grupa: Zarejestrowani
Postów: 286
Pomógł: 12
Dołączył: 23.11.2006
Skąd: WL

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


@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 (IMG:style_emoticons/default/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ą.

Ten post edytował szmerak 3.01.2012, 16:22:28
Go to the top of the page
+Quote Post
by_ikar
post
Post #9





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
404
post
Post #10





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

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


Dziękuję bardzo za odpowiedzi - teraz wszystko jest jasne i przejrzyste (IMG:style_emoticons/default/smile.gif)
Pozdrawiam! (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
viking
post
Post #11





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


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.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 18.09.2025 - 17:25