Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Klasa w klasie
Mephis
post 30.03.2014, 12:17:01
Post #1





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Witam.

Mam problem... Przeszukałem google pod podobnymi hasłami jak w temacie, lecz nie znalazłem odpowiedniego, działającego rozwiązania. A musi jakieś istnieć - chyba, że to co chcę zrobić, jest nieodpowiednie, lub istnieje owiele prostrzy spodób...

Mianowicie, mam dwie klasy: SQL i UserData. Pierwsza z nich służy do obsługi bazy danych. Druga będzie miała za zadanie zbierać z tej bazy różnego rodzaju informacje i odpowiednio je łączyć.

Klasę SQL wywołuję w taki sposób:
  1. require_once('inc/sql.class.php');
  2. $SQL = new SQL($sqlhost, $sqluser, $sqlpassword, $sqldatabase);

Baza łączy się w konstruktorze.

Próbowałem dołączać klasę w argumencie, lecz to nic nie dało.

W klasie Data pragnę odwoływać się do klasy SQL, ponieważ będę tam przeprowadzać wszelkie operacje oparte o dane użytkownika.
  1. class UserData {
  2. function getData() {
  3. $query = $SQL->query('zapytanie');
  4. }
  5. }


Jak zrobić coś tego typu?
Go to the top of the page
+Quote Post
Turson
post 30.03.2014, 12:26:14
Post #2





Grupa: Zarejestrowani
Postów: 4 291
Pomógł: 829
Dołączył: 14.02.2009
Skąd: łódź

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


  1. <?php
  2. class UserData {
  3. function __construct(){
  4. require_once('inc/sql.class.php');
  5. $this->SQL = new SQL($sqlhost, $sqluser, $sqlpassword, $sqldatabase);
  6. }
  7. function getData() {
  8. $query = $this->SQL->query('zapytanie');
  9. }
  10. }

W każdym bądź razie to nie najlepsze rozwiązanie.

Ten post edytował Turson 30.03.2014, 14:54:17
Go to the top of the page
+Quote Post
trueblue
post 30.03.2014, 12:28:10
Post #3





Grupa: Zarejestrowani
Postów: 6 803
Pomógł: 1827
Dołączył: 11.03.2014

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


A może do zainicjowanego obiektu klasy UserData przekazać obiekt klasy SQL?


--------------------
Go to the top of the page
+Quote Post
IProSoft
post 30.03.2014, 13:40:45
Post #4





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Myślę, że dla Ciebie będzie odpowiednie hasło Singelton i metoda getInstance()

Dodasz w klasie SQL metodę, a następnie w innych klasach skorzystasz z SQL :
  1. SQL::getInstance()->query('zapytanie');


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
ber32
post 30.03.2014, 13:46:22
Post #5





Grupa: Zarejestrowani
Postów: 332
Pomógł: 22
Dołączył: 6.07.2010

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


Turson dlaczego
Cytat
W każdym bądź razie to nie najlepsze rozwiązanie
też jestem ciekawy


--------------------
Go to the top of the page
+Quote Post
Mephis
post 30.03.2014, 14:46:29
Post #6





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Jak połącze się w klasie z bazą, to strona nie chce mi się wyświetlić... Tzn. gdy mam złe parametry połączenia, to naturalnie wyświetla mi się komunikat o znaczącej treści, że dane są nieprawidłowe, lecz gdy sa prawidłowe, strona się nie wyświetla. Zna ktoś jakieś inne rozwiązanie?
Ostatecznie mogę potraktować to jako zwyky zbiór funkcji... Ewentualnie zamieścił te funkcje w klasie SQL.

Ten post edytował Mephis 30.03.2014, 15:03:40
Go to the top of the page
+Quote Post
ctom
post 30.03.2014, 15:29:39
Post #7





Grupa: Zarejestrowani
Postów: 321
Pomógł: 55
Dołączył: 19.04.2009

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


Cytat(ber32 @ 30.03.2014, 14:46:22 ) *
też jestem ciekawy


bo każda klasa powinna być odpowiedzialna na "jedną rzecz" (?). Co klasę UserData obchodzi połączenie do DB.


--------------------
Polecam MyDevil hosting idealny dla deweloperów
Go to the top of the page
+Quote Post
Crozin
post 30.03.2014, 15:55:34
Post #8





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1. Ciebie nie interesuje wykorzystanie klasy w klasie, tylko obiektu w obiekcie.
2. Było już dosłownie dziesiątki razy na forum... zawsze kończyło się tym, że najlepszym rozwiązaniem, nie stwarzającym żadnych problemów i dającym jakieś korzyści z OOP jest IoC np. w realizacji przez dependency injection.

Ten post edytował Crozin 31.03.2014, 09:50:30
Go to the top of the page
+Quote Post
Mephis
post 31.03.2014, 09:16:30
Post #9





Grupa: Zarejestrowani
Postów: 94
Pomógł: 1
Dołączył: 16.12.2012

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


Hmm... Jak dla mnie to zbyt skomplikowane, może kiedyś z tego skorzystam. Cóż, skoro nie ma prostego rozwiązania, będę musiął uczynić tak jak napisałem wcześniej. Istnieje jeszcze możliwość przekazania w argumencie zaptania SQL.
Go to the top of the page
+Quote Post
in5ane
post 31.03.2014, 10:08:41
Post #10





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

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


Tutaj nie ma nic trudnego. Po prostu w swojej klasie Userdata zajmujesz się tylko tym, co ma ta klasa robić i zamiast tworzyć:
  1. require_once('inc/sql.class.php');
  2. $this->SQL = new SQL($sqlhost, $sqluser, $sqlpassword, $sqldatabase);
tworzysz w klasie SQL metodę
  1. public static function getInstance()
  2. {
  3. if (!self::$me)
  4. {
  5. self::$me = new Sql();
  6. }
  7.  
  8. return self::$me;
  9. }
dodatkowo musisz utworzyć zmienną
  1. private static $me = null;
i teraz w swojej klasie Userdata możesz się odwołać tak:
  1. Sql::instance()->query('SELECT * FROM users');
I bez tworzenia obiektu klasy Sql możesz odwoływać się do jej metod.

Ten post edytował in5ane 31.03.2014, 10:09:01


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
pyro
post 31.03.2014, 11:21:23
Post #11





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Jak masz już tworzyć takie glamoty, to lepiej już w ogóle nie używaj klas i obiektów, bo zrobisz podwójnie źle. Oprzyj się w takim wypadku na funkcjach (powrót do PHP4).

To samo się tyczy @in5ane oraz @IProSoft

Ten post edytował pyro 31.03.2014, 11:24:05


--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
Go to the top of the page
+Quote Post
IProSoft
post 31.03.2014, 11:47:44
Post #12





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


@pyro - z tego co piszesz woskuję, że lepiej nie uczyć się wcale, niż uczyć na błędach ?
Dostał najwygodniejsze rozwiązania z jego punktu widzenia ( nie koniecznie najlepsze ), skoro uważasz, że są złe, podaj lepsze.


--------------------
Manual prawdę Ci powie.
Go to the top of the page
+Quote Post
in5ane
post 31.03.2014, 11:49:27
Post #13





Grupa: Zarejestrowani
Postów: 1 335
Pomógł: 34
Dołączył: 9.11.2005
Skąd: Wrocław

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


A co jest złego w użytkowaniu singletona do połączenia z bazą danych jeśli na samym początku tworzenia aplikacji programista będzie wiedział, że połączenie będzie potrzebował zawsze jedno? Jak już zaczynasz coś pisać, to może rozwiń swoją myśl.


--------------------
> > > Tworzenie stron < < <
Go to the top of the page
+Quote Post
pyro
post 31.03.2014, 11:51:00
Post #14





Grupa: Zarejestrowani
Postów: 2 148
Pomógł: 230
Dołączył: 26.03.2008

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


Jakbyś pomagał uczyć się na błędach to byłoby OK, zamiast tego jedynie pchasz użytkownika w dalsze błędy.

Lepsze rozwiązania zostały już podane i nie widzę sensu pisać tego samego.

Cytat(trueblue @ 30.03.2014, 13:28:10 ) *
A może do zainicjowanego obiektu klasy UserData przekazać obiekt klasy SQL?



Cytat(ctom @ 30.03.2014, 16:29:39 ) *
bo każda klasa powinna być odpowiedzialna na "jedną rzecz" (?). Co klasę UserData obchodzi połączenie do DB.



Cytat(Crozin @ 30.03.2014, 16:55:34 ) *
1. Ciebie nie interesuje wykorzystanie klasy w klasie, tylko obiektu w obiekcie.
2. Było już dosłownie dziesiątki razy na forum... zawsze kończyło się tym, że najlepszym rozwiązaniem, nie stwarzającym żadnych problemów i dającym jakieś korzyści z OOP jest IoC np. w realizacji przez dependency injection.



--------------------
ET LINGUA EIUS LOQUETUR IUDICIUM
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: 26.06.2025 - 18:13