szymo
9.04.2012, 11:17:48
Witam.
W PHPie programuję dość długo i mam jako tako jakieś doświadczenie w strukturalnym pisaniu aplikacji. Postanowiłem się przerzucić na OOP i idzie mi całkiem nieźle... do czasu kiedy chcę skorzystać z bazy danych. Poczytałem o PDO, wiem jak z tego korzystać, ale jak to wygląda w praktyce? Załóżmy mam kilka klas, do wyświetlania newsów, ostatnich postów z forum itp. Każda pobiera coś z bazy danych i każda ma robić w sobie nowy egzemplarz PDO w tym celu? Trochę bez sensu mi się to wydaje. Chciałem skorzystać z singletona ale przeczytałem sporo opinii, że to zły pomysł. Jak Wy korzystacie korzystacie z bazy danych wewnątrz klasy?
Pozdrawiam!
Crozin
9.04.2012, 11:32:17
Każdemu z tworzonych obiektów przekazujesz istniejącą już instancję obiektu PDO. Z racji, że jest on wymagany do ich pracy powinien zostać przekazany już w konstruktorze.
szymo
9.04.2012, 11:57:40
Czyli chodzi Ci o coś takiego?
try {
$pdo = new PDO('mysql:host=' . MYSQL_LOCALE . ';dbname=' . MYSQL_DB, MYSQL_USER, MYSQL_PASS,
array(PDO
::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")); }
catch(PDOException $e) {
echo 'BŁĄD POŁĄCZENIA Z BAZĄ DANYCH: ' . $e->getMessage(); }
class News {
protected $_db;
public function __Construct($db) {
$this->_db=$db;
}
}
$newsy = new News($pdo);
Eh, sensowne i logiczne. Nie wiem czemu o tyn nie pomyślałem. Dzięki
thoriam
9.04.2012, 12:52:40
możesz również wykorzystać dziedziczenie
Crozin
9.04.2012, 12:55:47
@thoriam: Nie, nie bardzo może tutaj wykorzystać dziedziczenie.
thoriam
9.04.2012, 13:00:20
pewnie masz na myśli coś takiego
class News extends PDO{}
mi chodzi raczej o coś takiego
class News extends Base{}
gdzie w w klasie Base można dać połączenie do PDO, błędy oraz ewentualnie inne klasy
Crozin
9.04.2012, 13:21:47
@thoriam: Nadal na nie wiele mu się to zda.
szymo
9.04.2012, 13:34:56
Przy takim dziedziczeniu przy robieniu nowego egzemplarza i tak będzie się robić nowy egzemplarz PDO czyli nowe połączenie z bazą. Na stronie jest zazwyczaj kilka klas wykorzystujących połączenie z bazą. Tworzenie tylu połączeń nie jest chyba zbyt wydajne...
thoriam
9.04.2012, 17:18:32
mówię jak można zrobić a nie mówię że to jest wydajne ;D
viking
9.04.2012, 18:44:27
Zerknij w dokumentację Zend_Db, Zend_Db_Table i zobaczysz jak to może być robione. Model DbTable dziedziczy Zend_Db_Table_Abstract i to przekazujesz (albo bezpośrednio wykorzystujesz) w innych klasach modelu (kontrolera).
Orzeszekk
9.04.2012, 23:25:43
Moze propel/doctrine?
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.