Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Funkcje innych klas w klasach
Maxie
post
Post #1





Grupa: Zarejestrowani
Postów: 82
Pomógł: 1
Dołączył: 19.10.2011

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


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.
Go to the top of the page
+Quote Post
pitu
post
Post #2





Grupa: Zarejestrowani
Postów: 476
Pomógł: 96
Dołączył: 10.04.2008
Skąd: Koszalin

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


Poczytaj o dziedziczeniu.


--------------------
HTML/CSS/JS: jsfiddle
SQL: sqlfiddle
Go to the top of the page
+Quote Post
Kofel
post
Post #3





Grupa: Zarejestrowani
Postów: 99
Pomógł: 22
Dołączył: 14.12.2007
Skąd: Wyszków

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


Akurat tutaj nie powinno się dziedziczyć wink.gif
Go to the top of the page
+Quote Post
viking
post
Post #4





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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ć.


--------------------
Go to the top of the page
+Quote Post
sazian
post
Post #5





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


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
Go to the top of the page
+Quote Post
viking
post
Post #6





Grupa: Zarejestrowani
Postów: 6 380
Pomógł: 1116
Dołączył: 30.08.2006

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


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ą.


--------------------
Go to the top of the page
+Quote Post
sazian
post
Post #7





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

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


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
Go to the top of the page
+Quote Post
Dipter
post
Post #8





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

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


@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.

Ten post edytował Dipter 31.03.2013, 19:40:29
Go to the top of the page
+Quote Post
Pilsener
post
Post #9





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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?
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 Aktualny czas: 19.08.2025 - 04:23