Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] programowanie obiektowe, która opcja jest prawidłowa
Forum PHP.pl > Forum > PHP > Object-oriented programming
grzemach
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ć.
t4510r
Nie lubie używać global w php, wiec w klasie Pages dodałbym pole typu Forms.
marcio
Przekazuj obiekt do klasy ktora ma go pozniej uzyc.
kipero
A mi wydaje się, że sposób pierwszy jest najlepszy. Nowy formularz = nowa instancja klasy.
Fifi209
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?
vokiel
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. }

Fafu
  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.
deirathe
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.  
grzemach
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.
dr_bonzo
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.
-=Peter=-
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)
Cypherq
Dlaczego przez publiczną składową odradzane?
-=Peter=-
Ż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
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.