Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa w klasie
Forum PHP.pl > Forum > PHP
Mephis
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?
Turson
  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.
trueblue
A może do zainicjowanego obiektu klasy UserData przekazać obiekt klasy SQL?
IProSoft
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');
ber32
Turson dlaczego
Cytat
W każdym bądź razie to nie najlepsze rozwiązanie
też jestem ciekawy
Mephis
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.
ctom
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.
Crozin
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.
Mephis
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.
in5ane
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.
pyro
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
IProSoft
@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.
in5ane
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.
pyro
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.

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.