Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Funkcje innych klas w klasach
Forum PHP.pl > Forum > PHP > Object-oriented programming
Maxie
Witam. Dosyć nie dawno zacząłem pracować na OOP w php. Mam mały problem z kodem. Otóż jak mogę wykorzystać funkcję klasy A w klasie B. Np.
  1. class db{
  2. //połączyłem się już z bazą danych
  3. public function assoc($sql){
  4. $sql = mysql_query($sql);
  5. return mysql_fetch_assoc($sql);
  6. }
  7. }
  8.  
  9. class user{
  10. public nick = 'user';
  11. public function id(){
  12. // i w tym miejscu potrzebuję skorzystać z funckij assoc w ten sposób:
  13. return $db->assoc("SELECT * FROM `users` WHERE `nick` = "'.$this->nick.'"");
  14. }
  15. }

Ale nie wiem jak to zrobić, by móc użyć np($db->assoc) w np(class user).
Jest to wytłumaczone tak na moje umiejętności. Rzecz jasna w normalnym kodzie musiałbym np. stworzyć nową zmienną $db = new db(); itp. Ale pomijając to. To jak wykorzystywać funkcje z innych klas?
Z góry dziękuję za wyczerpującą odpowiedź i pozdrawiam, Maxie.
pitu
Poczytaj o dziedziczeniu.
Kofel
Akurat tutaj nie powinno się dziedziczyć wink.gif
viking
Na początek wywalić mysql_* na rzecz obiektowego PDO.
Później poczytać o http://martinfowler.com/eaaCatalog/dataMapper.html
W przypadku który tutaj przedstawiłeś bardzo często wykorzystuje się ten wzorzec.

Czyli jakaś klasa user zawiera tylko dane podstawowe użytkownika jak id, imie, nazwisko, pesel itp ale nie odpowiada bezpośrednio za obsługę danych. Do tego jest mapper będący pośrednikiem pomiędzy bazą (zazwyczaj jakimś ORMem np doctrine, propel) a modelem. Wiem że trudne na początek ale warto się pouczyć.
sazian
kurde ludzie ale wy kombinujecie, człowiek pyta jak światło zapalić a wy mu karzecie elektrownie atomową budować

@Maxie:
w linij 12 napisz $db=new db();
a jeszcze lepiej stwórz sobie właściwość w klasie user i twórz nowy obiekt db tylko raz np. w konstruktorze klasy user
viking
Bo wychodzę z założenia że jak uczyć to raz a dobrze smile.gif To co sugerujesz na 99% otwierało by w konstruktorze nowe połączenie z bazą.
sazian
Cytat(viking @ 31.03.2013, 13:19:13 ) *
Bo wychodzę z założenia że jak uczyć to raz a dobrze smile.gif

idąc tym tropem zakładam że w szkole podstawowej miałeś liczby zespolone, przecież poco się uczyć że pierwiastek drugiego stopnia z liczby ujemnej nie istnieje?

Cytat(viking @ 31.03.2013, 13:19:13 ) *
To co sugerujesz na 99% otwierało by w konstruktorze nowe połączenie z bazą.

rozumiem że chodzi ci o tworzenie nowego połączenia przy każdym wywołaniu konstruktora klasy user, tak ?
jeśli tak to 99,9% nie masz racji
dlaczego tak uważam ? ano dlatego że kolega "Maxie" zapewne przeczytał jakiś dosyć stary kurs i na jego podstawie zrobił coś takiego
  1. mysql_connect();
  2. class db{}
  3. class user{}



poza tym to co napisałeś nie odzwierciedla problemu
problemem było odwołanie się do jednej klasy z poziomu drugiej, a nie jak pobierać dane "z bazy do klasy" smile.gif
Dipter
@sazian
A co tutaj ma szkoła do nauki, którą ktoś sobie sam przyswaja? Co jak co, ale akurat rada z PDO była jak najbardziej trafna, bo jest to już wręcz "umówmy się" standard i proszę Cię - nie czepiaj się że jednak ku drodze nauki używać mysql_, bo to wpajanie tego samego dwa razy wink.gif

@topic
  1. <?php
  2.  
  3. class User
  4. {
  5.  
  6. private $db;
  7.  
  8. public function __construct(Db $db)
  9. {
  10. $this->db = $db;
  11. }
  12.  
  13. public function readByNick($nick)
  14. {
  15. return $this->db->assoc("SELECT * FROM `users` WHERE `nick` = "'.$nick.'"");
  16. }
  17.  
  18. }
  19.  
  20. $user = new User(new Db(/* ... */));
  21. $data = $user->readByNick('Arnold Boczek');


PS: Ad. nazewnictwa - "User" dotyczy bardziej już samego bytu użytkownika, a w twojej sytuacji tworzysz pewnego rodzaju menadżera, który zarządza już tymi użytkownikami (więc chyba UserManager byłby bardziej trafny).

Jeśli twoja aplikacja jest bardziej rozbudowana, to zainteresuj się Doctrinem.
Pilsener
Cytat
To jak wykorzystywać funkcje z innych klas?


Najprościej pewnie jak bozia kazała, niu objekt i jedziesz z metodami. Ale jak znam życie to i tak każdy zacznie kombinować naokoło thumbsdownsmileyanim.gif
Jest taki wzorzec nawet - fasada. Może od tego zacznij?
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.