Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] programowanie obiektowe, która opcja jest prawidłowa, Używać global czy w każdej funkcji tworzyć instancję klasy?
grzemach
post 18.08.2009, 16:31:22
Post #1





Grupa: Zarejestrowani
Postów: 121
Pomógł: 4
Dołączył: 9.06.2007
Skąd: Kielce

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


Witam,
Ostatnio nasunęło mi się pytanie odnośnie programowania obiektowego w PHP (a i chyba ogólnie).

Załóżmy że mamy plik index.php

  1. $pages = new Pages();
  2. $pages->funkcja1();
  3. $pages->funckja2();


Dodatkowo jest klasa z formularzami:
  1. class Forms{
  2. public function submit(){}
  3. public function inputText(){}
  4. }


Teraz w funkcji1 chcemy stworzyć jeden formularz i w funkcji2 chcemy stworzyć jeden formularz.
czyli
  1. class Pages{
  2. public function1(){
  3. $form = new Forms();
  4. // lecimy dalej z formularzem i treścią
  5. }
  6. public function2(){
  7. $form = new Forms();
  8. // dalej treści
  9. }
  10. }



Można zrobić też w drugi sposób tzn index.php by wyglądał
  1. $pages = new Pages();
  2. $form = new Forms();
  3. $pages->funkcja1();
  4. $pages->funckja2();


a Pages:
  1. class Pages{
  2. public function1(){
  3. global $form;
  4. // lecimy dalej z formularzem i treścią
  5. }
  6. public function2(){
  7. global $form;
  8. // dalej treści
  9. }
  10. }


Przy czym z użytkowego punktu widzenia nie ma to żadnego znaczenia. W tej klasie nie ma żadnej zmiennej statycznej, którą można by wymieniać między poszczególnymi funkcjami. Chciałem się zapytać która z tych opcji jest właściwa i która należało by używać.


--------------------
Go to the top of the page
+Quote Post
t4510r
post 18.08.2009, 18:01:45
Post #2





Grupa: Zarejestrowani
Postów: 13
Pomógł: 3
Dołączył: 15.07.2007

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


Nie lubie używać global w php, wiec w klasie Pages dodałbym pole typu Forms.


--------------------
"Każdy działający program jest przestarzały"
Go to the top of the page
+Quote Post
marcio
post 18.08.2009, 18:03:35
Post #3





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


Przekazuj obiekt do klasy ktora ma go pozniej uzyc.


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
kipero
post 18.08.2009, 18:29:59
Post #4





Grupa: Zarejestrowani
Postów: 233
Pomógł: 50
Dołączył: 28.10.2006
Skąd: Radom

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


A mi wydaje się, że sposób pierwszy jest najlepszy. Nowy formularz = nowa instancja klasy.


--------------------
Go to the top of the page
+Quote Post
Fifi209
post 18.08.2009, 18:34:41
Post #5





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(kipero @ 18.08.2009, 18:29:59 ) *
A mi wydaje się, że sposób pierwszy jest najlepszy. Nowy formularz = nowa instancja klasy.


A jak w drugiej funkcji chcesz użyć instancji, na której przed chwilą wykonywałeś jakieś operacje?


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
vokiel
post 18.08.2009, 21:01:49
Post #6





Grupa: Zarejestrowani
Postów: 2 592
Pomógł: 445
Dołączył: 12.03.2007

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


Cytat(fifi209 @ 18.08.2009, 19:34:41 ) *
A jak w drugiej funkcji chcesz użyć instancji, na której przed chwilą wykonywałeś jakieś operacje?
A no właśnie zależy od zamierzeń użycia.
1. Jeśli chce w każdej metodzie tworzyć nowy form i na nim operować.
2. Jeśli chce operować na jednym formie to wtedy przekazanie obiektu.
  1. //1.
  2. class Pages{
  3. public function1(){
  4. $form = new Forms();
  5. // lecimy dalej z formularzem i treścią
  6. }
  7. public function2(){
  8. $form = new Forms();
  9. // dalej treści
  10. }
  11. }
  12.  
  13. //2.
  14. class Pages{
  15. public function __construct(Forms $form){
  16. $this->form = $form;
  17. }
  18. public function1(){
  19. $this->form ='function1';
  20. // pierwsza oepracja na formularzu
  21. }
  22. public function2(){
  23. // druga operacja na tym samym formularzu
  24. if ($this->form == 'function1'){
  25. return 'byl edytowany w function1';
  26. }
  27. }
  28. }



--------------------
Go to the top of the page
+Quote Post
Fafu
post 18.08.2009, 21:06:23
Post #7





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

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


  1. $pages = new Pages();
  2. $form = new Forms();
  3. $pages->form = $form;
  4. $pages->funkcja1();
  5. $pages->funckja2();

i później w klasie używasz $this->form zamiast global.


--------------------
http://rafal.brzezinski.me - skrypty, tutoriale i inne.
Jeśli udało Ci się rozwiązać problem podziękuj osobom, które ci pomogły.
Go to the top of the page
+Quote Post
deirathe
post 19.08.2009, 09:18:02
Post #8





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

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


Jeżeli jesteś pewien że będziesz używać tylko jednego egzeplarza klasy Form, to skorzystaj z singleton.
  1. class Form
  2. {
  3. public static $instance;
  4. public function __construct()
  5. {
  6. self::$instance = $this;
  7. }
  8. public function getInstance()
  9. {
  10. if(!((object)self::$instance instanceof Form))
  11. new Form();
  12. return self::$instance;
  13. }
  14. }
  15. class Pages
  16. {
  17. public function function1()
  18. {
  19. $form = Form::getInstace();
  20. }
  21. public function function2()
  22. {
  23. $form = Form::getInstance();
  24. }
  25. }

I robisz:
  1. new Form();
  2. $page = new Pages();
  3. $page->function1();
  4. //itd...
  5.  


--------------------
Kawałek mojego blogu
Everything should be as simple as possible but not simpler.
A Einstein
Go to the top of the page
+Quote Post
grzemach
post 19.08.2009, 11:01:54
Post #9





Grupa: Zarejestrowani
Postów: 121
Pomógł: 4
Dołączył: 9.06.2007
Skąd: Kielce

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


singletonu używam do baz danych (logera itp), tutaj też jest możliwe aby go zastosować, w sumie to można by go zastosować przy każdej z klas smile.gif.

Właśnie chciałem zobaczyć jak to robicie Wy i jakie są Wasze propozycje.

Jeśli mam w dwóch miejscach użyć tej samej zmiennej (są od siebie zależne) to musi być to ta sama klasa, w tym klasach o których mi się rozchodzi, nie ma takiej potrzeby są to tylko generatory tabel, formularzy, rzeczy od siebie nie zależnych.

Jeśli chodzi o przekazywanie obiektu i singleton, to która z nich jest szybsza? bo jeśli chodzi o miejsce w pamięci przy przetwarzaniu skryptu, raczej będzie takie samo.

Ten post edytował grzemach 19.08.2009, 11:03:25


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post 19.08.2009, 11:33:35
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


sciana.gif sciana.gif sciana.gif sciana.gif

Nie potrzebujesz tu singletonu.
Rozwiazanie zalezy od tego co ty robisz, czym jest Page, czym Form (po co one sa, co robia, co reprezentuja), jak ze soba wspolpracuja itd.
Bez tej wiedzy nic dobrego nie stworzysz.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
-=Peter=-
post 19.08.2009, 13:45:37
Post #11





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Dependency Injection (@Fafu podał to rozwiązanie) - klik

Poprostu przekazujesz referencję obiektu (Form) do innego obiektu (Pages) poprzez konstruktor, metodę dostępową (setter, np. setForm()) lub też publiczną składową (odradzane).

@deirathe - ten Twój singleton jest trochę kulawy (publiczny konstruktor, nie będe się już czapiał możliwości klonowania bo przykład miał zapewne być okrojony, ale lepiej zmień modyfikator przy konstruktorze z public na private/protected)


--------------------
Go to the top of the page
+Quote Post
Cypherq
post 19.08.2009, 14:29:59
Post #12





Grupa: Zarejestrowani
Postów: 181
Pomógł: 9
Dołączył: 28.08.2006
Skąd: Katowice

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


Dlaczego przez publiczną składową odradzane?


--------------------
"Zero 'errorów' nic nie oznacza. Walidator sprawdza tylko składnię. Kod strony jest jak psu z d**y wyjęty i to, że walidator świeci się na zielono nie oznacza, że ta kupa jest ładna" - mike
Go to the top of the page
+Quote Post
-=Peter=-
post 19.08.2009, 14:36:53
Post #13





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

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


Żadna klasa nie powinna mieć publicznych składowych, powód - hermetyzacja danych, czyli jedna z podstawowych zasad OOP. Są również inne argumenty na to, ale nie chce mi się ich przytaczać, bo by wyszedł z tego przydługawy post, którego pisać mi się nie chce smile.gif


--------------------
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 Wersja Lo-Fi Aktualny czas: 22.06.2025 - 14:29