Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy ten kod jest OOP?
Forum PHP.pl > Forum > PHP > Object-oriented programming
Noctrum
Jestem poczatkujacy w dziedzinie OOP. Pisze a raczej probuje pisac aplikacje baze danych kin, seansow, filmow. Napisalem 2 klasy: 1.laczenia z baza SQL
2.kina (jak narazie tylko pokazuje nazwy kin)

Chcialbym zapytac czy to przypomina obiektowke? I jak powinno sie konstuowac klasy typu kino,film w takim projekcie.

class.connect.php
  1. <?php
  2.  class DB {
  3.  private $link;
  4.  public $result;
  5.  public $row;
  6.  
  7.  public function __construct(){
  8.     $this-> link = mysql_connect(localhost,root,krasnal);
  9.     mysql_select_db(kino);
  10.     
  11.     if(!is_resource($this -> link)){
  12.             die('Brak połączenia z bazą!');
  13.          }
  14.  }
  15.  public function setCinema(){
  16.  $this-> result=mysql_query(&#092;"SELECT name FROM cinema ORDER BY id DESC\")or die('Wystapil blad');
  17.  }
  18.  public function getCinema(){
  19.  while ($this-> row = mysql_fetch_assoc( $this->result )){
  20.  print $this->row['name'].&#092;" \";
  21.      }
  22.  }
  23.  
  24. }
  25. $baza = new DB;
  26. ?>

class.cinema.php
  1. <?php
  2.  class cinema {
  3.   
  4.   public function __construct(){
  5.     require_once(&#092;"class.connect.php\");
  6.     DB::setCinema();
  7.     DB::getCinema();
  8.  }
  9.  
  10.  }
  11.  $kino = new cinema;
  12. ?>


Prosze o wszelkie uwagi.
Ociu
Twój kod nie ma najmniejszego sensu. Nie rozdzielasz zadań jakie mają mieć klasy DB i cinema. Db - ma za zadanie łączenia się z bazą danych, ułatwienie w pobieraniu rekordów, a nie już pobieranie danych. Pobieranie danych należy do klas dziedziczących po Db, np. cinema.

pozdrawiam.
Noctrum
A moge prosic o szablon jak powino to wygladac (jak porozdzielac metody klas).Chcialem rowniez dodac opcje 'dodawania,usuwanie i modyfikowania danych kina'. Czy powinienem w tym celu zrobic klase cinema_manager w ktorej beda metody dodawanie kina, usuwanie kina a w klasie cinema tylko wyswietlanie?



Dopiero ucze sie OOP. Czytam tutoriale i probuje sie w tym wszystkim polapac.
Sedziwoj
@Noctrum
Jak się uczysz, to powinieneś czytać, już na tym podforum było wiele pytań o takie rzeczy, poczytaj co tam proponują jakie uwagi były, a wtedy jak czegoś nadal nie będziesz rozumiał pisz.
Ale w tym kodzie jak napisał Ociu nie ma krzty podejścia obiektowego. Dlaczego? Powiedz w jednym dwóch zdaniach co robi dany obiekt? Może to głupio brzmi ale tak jest, każdy obiekt ma robić tylko konkretną czynność, jak robi wszystko to znaczy że to nie jest podejście obiektowe. (mimo że są obiekty)
Co robi baza? Można wybrać coś, wstawić, aktualizować i usunąć, to są główne aspekty. Więc obiekt bazy to powinien mieć, nic więcej, bez konkretnych zapytań, bo to nie jego robota. Chcesz obsługiwać kina, seanse, klientów itd. więc nie możesz zaszywać rzeczy związanych z nimi w klasie DB.

(Są zresztą ORM, co by robiły co chcesz zrobić, ale jak chcesz tylko pisać aby się nauczyć to nie ma sensu korzystać, możesz najwyżej zobaczyć jak tam jest to zrobione, ale na tym poziomie chyba byś się pogubił)
Babcia@Stefa
Witam, też raczkuję w OOP ale myślę że lepszym rozwiązaniem jest:

  1. <?php
  2. class DB {
  3.  private $link;
  4.  public $result;
  5.  public $row;
  6.  
  7.  public function __construct(){
  8. $this-> link = mysql_connect(localhost,root,krasnal);
  9.  
  10. if(!is_resource($this -> link)){
  11. die('Brak połączenia z bazą!');
  12.  }
  13.  }
  14.  
  15.  public function query($ARG_SQL)
  16.  {
  17.  $this->result = mysql_query($ARG_SQL);
  18.  }
  19.  
  20.  public function fetch_array()
  21.  {
  22. $this->row = @mysql_fetch_array($this->result);
  23.  if($this->row)
  24.  return $this->row;
  25.  else
  26. throw new Exception ('Nie można odczytać elementów z bazy danych i zapisać do tablicy.');
  27.  }
  28.  
  29.  class Cinema extends DB
  30.  {
  31.  
  32. public function setCinema()
  33. {
  34. $this->query("SELECT name FROM cinema ORDER BY id DESC");
  35.  }
  36.  
  37.  public function getCinema()
  38.  {
  39.  while ($this-> result = mysql_fetch_assoc( $this->result )){
  40.  print $this->row['name']." ";
  41.  }
  42.  }
  43. ?>


Nie wiem czy dobrze, nie testowałem winksmiley.jpg
Ale przynajmniej z dziedziczeniem jest chyba jakiś sens...

Dziękuję, Babcia@Stefa
-=Peter=-
Też nie ma sensu i też nie jest to OOP. Powinna być osobna klasa odpowiedzialna za bazę danych (czyli w niej metody np. "select", "query", ta klasa łączy się z bazą danych). Jest kilka możliwości rozwiązania problemu, np ActiveRecord, DAO. Przykładowo (pseudokod):

  1. <?php
  2. class Database{
  3. //uchwyt bazy danych
  4. protected $hConn;
  5. public function __construct(){
  6. //polaczenie z bd
  7. }
  8.  
  9. public function query($sql){
  10. return $query($sql, $this->hConn);
  11. }
  12.  
  13. //jakieś inne metody
  14. }
  15.  
  16. interface DAO{
  17. public function getById($id);
  18. public function delete();
  19. public function getAll();
  20. public function save(RowObject $o);
  21. }
  22.  
  23.  
  24. abstract class SqlDao implements DAO{
  25. protected $className;
  26. protected $tableName;
  27. protected $db;
  28.  
  29. public function __construct($className, $tableName, Database $db){
  30. $this->className = (string) $className;
  31. $this->tableName = (string) $tableName;
  32. $this->db = $db;
  33. }
  34.  
  35. public function getById($id){
  36. $table = $this->tableName;
  37. $class = $this->className;
  38. $sql = "SELECT * FROM $table WHERE id='$id';";
  39. $res = $this->db->query($sql);
  40. $record = mysql_fetch_assoc($res);
  41. return new $class($record);
  42. }
  43.  
  44. public function delete(RowObject $o){
  45. //implementacja
  46. }
  47.  
  48. public function getAll(){
  49. //implementacja
  50. }
  51.  
  52. public function save(RowObject $o){
  53. //implementacja
  54. }
  55. }
  56.  
  57. interface RowObject{
  58. public function getId();
  59. }
  60.  
  61. abstract class AbstractRowObject implements RowObject{
  62. protected $fields = array();
  63. protected $data = array();
  64.  
  65. public function __construct(array $fields, array $data = array()){
  66. $this->fields = $fields;
  67. $this->data = $data;
  68. }
  69.  
  70. public function __get($name){
  71. if(array_value_exists($name, $this->fields)){
  72. return $this->data[$name];
  73. }
  74. }
  75.  
  76. public function __set($name, $value){
  77. if(array_value_exists($name, $this->fields)){
  78. $this->data[$name] = $value;
  79. }
  80. }
  81.  
  82. public function getId(){
  83. return $this->data['id'];
  84. }
  85. }
  86.  
  87. class CinemaDAO extends SqlDao{
  88.  
  89. public function __construct(Database $sql){
  90. parent::__construct('cinema', 'Cinema', $sql);
  91. }
  92.  
  93. }
  94.  
  95. class Cinema extends AbstractRowObject{
  96. public function __construct($data = array()){
  97. parent::__construct(array('id', 'name', 'location'), $data);
  98. }
  99. }
  100. ?>


zastosowanie:

  1. <?php
  2. $dao = new CinemaDao($db);
  3. $cinema = $dao->getById($id);
  4.  
  5. //lub
  6. $c = new Cinema();
  7. $c->name = "nazwa";
  8. $c->location = "lokacja";
  9. $dao->save($c);
  10. ?>


Na forum jest dosyć dużo rozwiązań tego "problemu", więc szukaj...
Cysiaczek
Kilka, kilka dni temu, za paroma topikami...
Temat: PHPskrypt w OOP
kilko
Pozdrawiam.

Przy okazji - proszę poprawić temat na sensowny
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.