Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Tworzenie obiektu wewnątrz innej klasy.
yayco
post 17.02.2013, 17:01:33
Post #1





Grupa: Zarejestrowani
Postów: 32
Pomógł: 2
Dołączył: 22.01.2008

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


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



Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
thek
post 17.02.2013, 17:55:29
Post #2





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
yayco
post 17.02.2013, 21:15:10
Post #3





Grupa: Zarejestrowani
Postów: 32
Pomógł: 2
Dołączył: 22.01.2008

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


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.
Go to the top of the page
+Quote Post
ano
post 19.02.2013, 11:49:46
Post #4





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

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


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)


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post
thek
post 20.02.2013, 00:30:07
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
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 Wersja Lo-Fi Aktualny czas: 25.07.2025 - 01:06