Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Active record - operator ::
Forum PHP.pl > Forum > PHP
Wolfie
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 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 smile.gif
marcio
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

Wolfie
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 ?
marcio
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.

Wolfie
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.....
230005
Przede wszystkim co robi to:

 private $connection;

poza definicją jakiejkolwiek klasy?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.



Wolfie
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....
230005
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).
Wolfie
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 ?
230005
W sumie fakt, że dziwnie to wygląda 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:smile.gif.
Wolfie
A co w przypadku gdy ta zmienna nie jest obiektem ?
230005
No jak nie jest obiektem, to nie wywołasz jej metod, bo nie ma żadnych, to chyba jasne? biggrin.gif
Wolfie
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 ?
230005
Pewnie bardziej niż tamto 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.
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.