Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Tworzenie obiektu wewnątrz innej klasy.
Forum PHP.pl > Forum > PHP > Object-oriented programming
yayco
Witam,
zaczynam pisać pewną aplikację (prosty CMS do pisania artykułów), dodam iż celem jest tylko zdobycie wiedzy i doświadczenia w OOP.

Program: posiadam dwie klasy, jedna łaczy się z bazą danych, druga jest odpowiedzialna za dodawanie artykułow do bazy. Czy tworzenie obiektu oConnectionClass wewnątrz klasy ArticleClass to jest dobrym rozwiązaniem? Wiem, ze napewno można to zrobić inaczej ale to rozwiązanie tez działa.


Mam klasę do połączenia z bazą MySql:
  1. class ConnectionClass {
  2. public $connection;
  3. protected $dns = 'mysql:host=localhost;dbname=projekt';
  4. protected $username = 'root';
  5. protected $password = '';
  6.  
  7. public function openConnection()
  8. {
  9. try {
  10. $this->connection = new PDO($this->dns, $this->username, $this->password);
  11. }
  12. catch (PDOException $e) {
  13. echo $e->getMessage();
  14. file_put_contents('log/PDOErrors.txt', $e->getMessage() . "\n", FILE_APPEND | LOCK_EX);
  15. }
  16. }
  17.  
  18. public function closeConnection(){
  19. if($this->connection != null){
  20. $this->connection = null;
  21. }
  22. }
  23. }



A tutaj mam klasę ArticleClass:
  1. class ArticleClass {
  2. public $topic;
  3. public $content;
  4. public $author;
  5. public $posted;
  6. public $category;
  7. public $tags = array();
  8.  
  9. public function __construct($topic,$content,$author,$category,$tags) {
  10. $this->topic = $topic;
  11. $this->content = $content;
  12. $this->author = $author;
  13. $this->posted = date ("Y-m-d H:i:s"); //format daty zgodny z MySQL DATETIME.
  14. $this->category = $category;
  15. $this->tags = $tags;
  16. }
  17.  
  18. public function SaveArticle() {
  19. require 'class/ConnectionClass.php';
  20. $oConnectionClass = new ConnectionClass();
  21. $oConnectionClass->openConnection();
  22.  
  23. $sql = 'INSERT INTO articles (article_topic,article_content,article_author,article_posted,article_categor
    y,article_tags)
  24. VALUES (:article_topic,:article_content,:article_author,:article_posted,:article_ca
    tegory,:article_tags)'
    ;
  25. $stmt = $oConnectionClass->connection->prepare($sql);
  26. $stmt->execute(array(
  27. ':article_topic' => $this->topic,
  28. ':article_content' => $this->content,
  29. ':article_author' => $this->author,
  30. ':article_posted' => $this->posted,
  31. ':article_category' => $this->category,
  32. ':article_tags' => $this->tags)
  33. );
  34. echo "Zapisano";
  35.  
  36. $oConnectionClass->closeConnection();
  37. }
  38. }



thek
Jak dla mnie to Connection powinno być abstrakcją. Nie skazuj się z góry na fakt, iż będziesz miał do czynienia z obiektami, które PDO obsłuży, bo się możesz przejechać. Przykład? Artykuły wręcz proszą się o połączenie ich z bazami noSQL lub silnikami pokroju Sphinx. Weź też pod uwagę, że możesz mieć inny cel zapisu niż baza. Sama klasa Article chcąc, nie chcąc, będzie korzystać z jakiegoś połączenia. Jeśli nie do zapisu, to do odczytu. Tylko, że IMHO powinno to połączenie być przekazywane jako obiekt dla odpowiednich metod lub w ostateczności jako parametr dla konstruktora (Dependancy Injection się kłania).
yayco
Twoj post daje do myślenia. Pomysl z abstrakacja wydaje sie ze rozwiazal moj problem.

A mam jeszcze takie pytanie odnośnie otwieranie połaczenia i zakonczenie połaczenia z bazą.
Założmy ze bede korzystac z jednej bazy na jednym hoscie. Lepiej tworzyc i zamykać polaczenie w kazdej metodzie ktora zapisuje/odczytuje dane . Czy poprostu na poczatku strony np. index.php raz otworzyć polaczenie i raz zakonczyc gdzies na koncu.
ano
Oczywiście, że tylko raz utworzyć połączenie (inaczej zabijesz sobie serwer, wydajność itp)
Dlatego saveArticle do przepisania ;-)
Poza tym czemu obiekt Article ma wiedzieć coś o Connection? Zrób dodatkową warstwę, tak aby on nic nie musiał wiedzieć o bazie. Dopiero ta pośrednia warstwa będzie Ci służyć do zapisu/odczytow artykułów z bazy.
Dzięki temu ten sam obiekt Article będziesz mógł np naturalnie raz pchać do mysql, a raz do zupełnie czegoś innego. (Jak wspominał @thek)
thek
Ależ ja o tym napisałem ano. Zauważ, że obiekt Connection w sumie nie mówi nic o celu zapisu. To jakiś abstrakcyjny byt. Tak naprawdę wystarczy by klasa Article w tym wypadku miała metody get i set. Get z parametrem tablicowym szukało by pasującego do podanych kryteriów lub zwracało ewentualnie pusty obiekt klasy Article. Zależy czy chciałbyś połączyć get z ewentualną osobną metodą find czy nie. Set z tablicą zapisywało by takowy obiekt lub tworzyło nowy.Tu nie muszę wiedzieć czy celem operacji jest baza, xml czy cokolwiek. To bym w konfiguracji sobie zdefiniował jako driver, który dostarczyłby mi implementacji interfejsu. Oczywiście to tylko jedna z metod na szybko. Lepiej byłoby to jeszcze bardziej uniwersalnie zrobić.
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.