Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Active record - operator ::
Wolfie
post
Post #1





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


Witam,


Probuje ogarnac jak dziala active record juz od 2 dni, potrzebuje tego zeby napisac moja pierwsza porzadna aplikacje obiektowa.

Natknalem sie na jakies marne materialy w internecie na ten temat, grzebalem na forum i ciagle malo rozumiem, wiem ze chodzi tutaj o mapowanie tabeli na obiekty ale z implementacja mam juz problem, jesli ktos moglby mi wytlumaczyc kilka rzeczy bede wdzieczny.

Oto co do tej pory napisalem z pomoca kolegow a zaraz zadam pytania (IMG:style_emoticons/default/smile.gif)

  1. <?php
  2.  
  3. class Database {
  4.  
  5. function query($sql) {
  6. }
  7. }
  8.  
  9. private $connection;
  10.  
  11. class MysqlDatabase extends Database {
  12.  
  13. public function __construct($host, $user, $pass, $dbname) {
  14. $this->connection = mysql_connect($host, $user, $pass);
  15. mysql_select_db($dbname, $this->connection);
  16. }
  17.  
  18. public function query($sql) {
  19. $resultSet = mysql_query($sql, $this->connection);
  20. $result = array();
  21. while($r = mysql_fetch_assoc($resultSet)) {
  22. $result[] = $r;
  23. }
  24. return $result;
  25. }
  26. }
  27. ?>


Powyzej mamy klase opakowujaca polaczenie z baza danych, no i tutaj raczej nie ma jakis niespodzianek, wszystko jasne

Teraz kolejna klasa :

  1. class ActiveRecord {
  2. public $db;
  3. public $tableName;
  4. function insert() {
  5. }
  6. function update() {
  7. }
  8. function delete() {
  9. }
  10. static function find($id) {
  11. }
  12. }
  13.  
  14. class Klient extends ActiveRecord {
  15.  
  16. }
  17.  
  18. ActiveRecord::$db = new MysqlDatabase("localhost", ....);
  19.  
  20. $klient = Klient::find(5);
  21. $klient->ulubiony = true;
  22. $klient->update();


No i tutaj zaczynaja sie schody, po pierwsze co oznacza ten zapis ?

  1. ActiveRecord::$db = new MysqlDatabase("localhost", ....);


Głownie chodzi mi o odwolanie sie za pomoca dwukropka, czy $db jest zmienna statyczna ze w taki sposob jest tutaj odwolanie ?

Nastepnie kolejny rzecz, po dyskusjach z kolega powiedzial mi ze jednak lepiej byloby klase Active Record rozbic na dwie klasy aby zrezygnowac z funkcji statycznej find() , wyglada to wtedy tak :

  1. class Table {
  2. public $tableName;
  3. public $db;
  4. function find($id) {
  5. }
  6. }
  7. class Row {
  8. function insert() {
  9. }
  10. function update() {
  11. }
  12. function delete() {
  13. }
  14. }
  15.  
  16. class KlientTable extends Table {
  17. function findTychKtórzyNiePlaca() {
  18. $this->db->query("SELECT * FROM ......"
  19. return new KlientRow(....);
  20. }
  21. }
  22.  
  23. class KlientRow extends Row {
  24. function zanotujZebyWyslacUpomnienie() {
  25.  
  26. }
  27. }
  28.  
  29.  
  30. $klienci = new KlientTable();
  31.  
  32.  
  33. $klient = $klienci->findTychKtórzyNiePlaca();
  34.  
  35. $klient->zanotujZebyWyslacUpomnienie();


W tym przypadku nie rozumiem dlaczego jest to rozbite na dwie klasy, tzn wiem dlaczego ale nie znam mechanizmu rzadzacego tym procesem, no i sprawia mi klopot zrozumiene tej linijki :

  1. $this->db->query("SELECT * FROM ......


nie wiem poprostu czy db jest metoda czy zmienna no i jak to powinno dzialac ......

Licze ze znajdzie sie dobra dusza ktora przyblizy mnie od zbudowania mojej aplikacji (IMG:style_emoticons/default/smile.gif)

Ten post edytował Wolfie 13.08.2009, 12:43:57
Go to the top of the page
+Quote Post
marcio
post
Post #2





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Cytat
Głownie chodzi mi o odwolanie sie za pomoca dwukropka, czy $db jest zmienna statyczna ze w taki sposob jest tutaj odwolanie ?


Tak jest zmienna statyczna i do niej przypisywany jest obiekt klasy MySqlDatabase.

Potem:

  1.  
  2.   class Database {
  3.  
  4.   function query($sql) {
  5.   }
  6.   }
  7.  
  8.   private $connection;
  9.  
  10.   class MysqlDatabase extends Database {
  11.  
  12.   public function __construct($host, $user, $pass, $dbname) {
  13.   $this->connection = mysql_connect($host, $user, $pass);
  14.   mysql_select_db($dbname, $this->connection);
  15.   }
  16.  
  17.   public function query($sql) {
  18.   $resultSet = mysql_query($sql, $this->connection);
  19.   $result = array();
  20.   while($r = mysql_fetch_assoc($resultSet)) {
  21.   $result[] = $r;
  22.   }
  23.   return $result;
  24.   }
  25.   }
  26.  
  27.  
  28.  


TO jest chyba jakas pomylka zeby robic klasy tylko z deklaracja funkcji i potem po niej dziedziczyc tu i we wszystkich ponizszych przypadkach.

WIec chyba raczej chodzilo ci o interfejsy ktore towrza odpowiednie API dla klas ktore je uzywaja ewentualnie klasy abstrakcyjne.

Odsylam do: 

->http://webcity.pl/webcity/programowanie_obiektowe_w_php_5_cz__2#klasy_abstrakcyjne

->http://webcity.pl/webcity/programowanie_obiektowe_w_php_5_cz__3#interfejs_-_z_czym_to_sie_je



Poczytaji bedziesz mial wszystko jasne.



W sumie nie wiem co to Active Record ale masz to wszystko jakies takie zamotane

Go to the top of the page
+Quote Post
Wolfie
post
Post #3





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


Nie no akurat ta czesc kodu :

  1. class Table {
  2. public $tableName;
  3. public $db;
  4. function find($id) {
  5. }
  6. }
  7. class Row {
  8. function insert() {
  9. }
  10. function update() {
  11. }
  12. function delete() {
  13. }
  14. }


Jest do uzupelnienia, jasne ze trzeba tutaj usupelnic funkcje.

Jesli chodzi o ta czesc :

  1. class Database {
  2. function query($sql) {
  3. }
  4. }
  5.  
  6. class MysqlDatabase extends Database {
  7. function __construct($host, $user, $pass, $dbname) {
  8. $this->connection = mysql_connect($host, $user, $pass);
  9. mysql_usedb($this->connection, $dbname);
  10. }
  11. function query($sql) {
  12. $resultSet = mysql_query($this->connection, $sql);
  13. $result = array();
  14. while($r = mysql_fetch_assoc($resultSet)) {
  15. $result[] = $r;
  16. }
  17. return $result;
  18. }
  19. }


To jest to jak najbardziej poprawne moim zdaniem , poniewaz uniezalezniamy polaczenie z baza od tego jaka baze posiadamy, tutaj akurta mamy napisana funkcje dla bazy MySql ale moga tu sie takze pojawic funkcje dla np PosgreSql itp.....

Moze ktos kto zna active record sie wypowie ?
Go to the top of the page
+Quote Post
marcio
post
Post #4





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

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


Cytat
To jest to jak najbardziej poprawne moim zdaniem , poniewaz uniezalezniamy polaczenie z baza od tego jaka baze posiadamy, tutaj akurta mamy napisana funkcje dla bazy MySql ale moga tu sie takze pojawic funkcje dla np PosgreSql itp.....


No to wlasnie o tym mowie oparl bys to o jakis wzorzec ktory sie do tego nadaje jak factory czy strategy to by to jakos wygladalo razem z interfejsami i by dzialalo jak trzeba na kazdej bazie.

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





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


No tak, ale mi chodzi o zrozumienie i stworzenie Acrive Record dla polaczenia z baza danych, i glownei to chce zrozumiec, ten plik ktory zawiera klase Database akurta mnie malo w tym momencie interesuje, interesuje mnie jak we wzorcu Active Record mapowac tabelke oraz rzedy tabeli na obiekty, dlatego poprosilbym kogos kto cos wie na temat Active Record co powienienem poprawic itd, bede bardzo wdzieczny za wskazowki.....
Go to the top of the page
+Quote Post
230005
post
Post #6





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


Przede wszystkim co robi to:

 private $connection;

poza definicją jakiejkolwiek klasy?(IMG:style_emoticons/default/questionmark.gif)

Po drugie:

public $db;
public $tableName;



Te zmienne będą statyczne jeśli zadeklarujesz je jako takie, czyli marcio bzdury gada pisząc, że są statyczne. Powinno być

static $db;
static $tableName;

$this->db->query("SELECT * FROM ......

Po trzecie db to zmienna, której metodą jest query.



Po czwarte sugeruję, żebyś nie zabierał się za wzorce projektowe, dopóki nie zrozumiesz programowania obiektowego, a na razie go nie rozumiesz. Poszukaj więc jakiegoś kursu, bo na razie to porywasz się z motyka na księżyc.



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





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


Cytat
Po trzecie db to zmienna, której metodą jest query.


Ale jakim cudem jest to zmienna jesli odwolujemy sie do niej poprzez $this->db , jesli bylaby zmienna statyczna to odwolanie wygladaloby zupelnie inaczej , czyli przy pomocy Klasa::zmienna o ile sie nie myle ?

Programowanie obiektowe juz przerabialem , ale od miesiaca sie tym nie znajmowalem, tez doszedlem do tego wniosku ze musze sobie przejrzec jakis kurs....
Go to the top of the page
+Quote Post
230005
post
Post #8





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


Do zmiennych niestatycznych odwołujemy się właśnie w ten sposób. Tak samo odwołujemy się do metod klasy, które nie są statyczne. Co do wywołania statycznej zmiennej, to tak - odwołanie wygląda w ten sposób (albo, jeśli w kontekście klasy self::zmienna).
Go to the top of the page
+Quote Post
Wolfie
post
Post #9





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


Czyli w takim razie albo powinno wygladac to tak :

  1. public $db
  2.  
  3. $this->db->query()


Lub tak :

  1. static $db
  2.  
  3. Klasa::$db->query() ?


Czy to drugie wywolanie ma prawo istniec ?
Go to the top of the page
+Quote Post
230005
post
Post #10





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


W sumie fakt, że dziwnie to wygląda (IMG:style_emoticons/default/tongue.gif) . A istnieć ma prawo - wywołujesz statyczną zmienną jakiejś klasy, ale ta zmienna jest obiektem, stąd operator ->. Tylko nawet jak używasz klas statycznych, to staraj się używać ich zmiennych wewnątrz ich samych, żeby bałaganu w kodzie nie robić (self:(IMG:style_emoticons/default/smile.gif) .

Ten post edytował 230005 13.08.2009, 15:17:54
Go to the top of the page
+Quote Post
Wolfie
post
Post #11





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


A co w przypadku gdy ta zmienna nie jest obiektem ?
Go to the top of the page
+Quote Post
230005
post
Post #12





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


No jak nie jest obiektem, to nie wywołasz jej metod, bo nie ma żadnych, to chyba jasne? (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Wolfie
post
Post #13





Grupa: Zarejestrowani
Postów: 686
Pomógł: 0
Dołączył: 10.11.2008
Skąd: Łódź

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


Ok, napisalem cos takiego :

  1. class Table {
  2. private $tableName;
  3. public $db;
  4. function find($id) {
  5. return "SELECT * FROM $this->tableName WHERE id='$id'";
  6. }
  7.  
  8. function setTableName($tableName) {
  9. return $this->tableName = $tableName;
  10. }
  11. }
  12.  


Czy to juz ma rece i nogi ?
Go to the top of the page
+Quote Post
230005
post
Post #14





Grupa: Zarejestrowani
Postów: 316
Pomógł: 36
Dołączył: 2.04.2008

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


Pewnie bardziej niż tamto (IMG:style_emoticons/default/winksmiley.jpg) . Ale wciąż nie rozumiem dlaczego ze zmiennej db czynisz publiczną. Nie wiem co powiedzą inni, ale przynajmniej ja tak nie programuję dopóki nie jest to absolutnie niezbędne. Jest milion innych rozwiązań twojego problemu więc radzę żebyś się wysilił i znalazł rozsądniejsze.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 14.09.2025 - 21:44