|
PHP PHP aplikacije, Smarty, PEAR |
|
Alati teme | Način prikaza |
10. 03. 2009. | #1 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
Pozivanje metoda jedne klase u drugim klasama
Zdravo svima.
Zanima kako je najbolje pozivati funkcije (metode) neke DB klase u drugim klasama (recimo News class) a da to ispoštuje principe OOP, a da ima nekog smisla tako raditi. Jasno mi je da ovdje nema smisla ici sa nasljijedivanjem. Jesam li upravu ako kazem da je najlogicnije kreirati objekat Database klase unutar zeljene funkcije druge klase (News klase) i onda pozivati željene funckije Database klase?! Osakacena verzija DB kalse je ispod, kao i klasa News sa insertNews metodom. Bilo kakva pomoc, link na slicnu tematiku? Kôd:
<?php //author: http://www.milesj.me/ define('DB_HOST', 'localhost'); define('DB_NAME', 'sportsport'); define('DB_USER', 'root'); define('DB_PASS', 'root'); class Database { /** * Contains the database instance * @property instance */ private static $instance; /** * Holds the database connection link * @property mixed */ private $connection = NULL; /** * Contains database connection information * @property array */ private $db = array( 'server' => DB_HOST, 'database' => DB_NAME, 'username' => DB_USER, 'password' => DB_PASS ); /** * If you want data returned as an object instead of an array * @property boolean */ private $asObject = false; /** * Connects to the database on class initialize; use getInstance() * @return void */ private function __construct() { $this->connect(); } /** * Connects and returns a single instance of the database connection handle * @return instance */ public static function getInstance() { if (!isset(self::$instance)){ self::$instance = new Database(); } return self::$instance; } /** * Attempts to connect to the MySQL database * @return boolean */ private function connect() { $this->queries = array(); $this->executed = 0; $this->connection = mysql_connect($this->db['server'], $this->db['username'], $this->db['password']); if ($this->connection) { if (!mysql_select_db($this->db['database'], $this->connection)) { trigger_error('Database::connect(): '. mysql_error() .'. ('. mysql_errno() .')', E_USER_ERROR); } } unset($this->db['password']); return $this->connection; } /** * Executes the sql statement after being prepared and binded * @param string $sql * @return mixed */ public function execute($sql) { $result = mysql_query($sql, $this->connection); if ($result === false) { $failure = mysql_error() .'. ('. mysql_errno() .')'; trigger_error('Database::execute(): '. $failure, E_USER_ERROR); } return $result; } /** * Fetches all rows from the query * @param result $query * @param bool $asObject * @return array */ public function fetchAll($query) { if ($this->asObject === true) { $result = mysql_fetch_object($query); } else { $result = mysql_fetch_assoc($query); } return $result; } } Kôd:
class News { public function insertNews() { // pozvati funkciju execute($sql) DataBase klase // najbolji i najispravniji nacin? } } |
10. 03. 2009. | #2 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
zasto nema smisla nasledjivati ?
|
10. 03. 2009. | #3 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
Nekako mi nemaju prevelike logicke veze, mada kada bolje razmislim u vecini slucajeva bi se koristile sve (ili vecina) metode naslijedjne klase, tako da i mozda ima smisla
Visestruko naslijedivanje? Da li se moze desiti problem (ne znam sada navesti mogucu siutaciju, recimo news treba da naslijedi DB i Session class) u kojem mi klasa C treba naslijediti kalse A i B ili ce mi biti dovoljno pojedinacno nasljedivanje. Nemam puno iskustva sa OOP u praksi, tako da su mi potrebne smjernice. Hvala. |
10. 03. 2009. | #4 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
News db table apstraction class nasledjuje Db class
gde news tabela ima metode poput save, delete isl na kraju imas news klasu koja nasledjuje news db table apstraction klasu i implementira njene metode u logicke celine, tipa InsertNewsEntry (validate, obradi podatke, save) Idealno bi bilo kada bi ti apstrakcije db tabela usustini bile samo konfiguracije db klase koja bi definisala opste metode insert, delete, update, load. U tom slucaju bi imao (grub primer): Class DB_Apstracion __construct <- record_id load_record(record_id) save if record loaded: update else: insert update insert delete ... count fetch .... (sta vec hoces) Class News_TableDB extends DB_Apstraction private db_fields array ( polja ) public ime_tabele __construct <-- record_id init(record_id) init parent::__construct(record_id) save parent::save(record_id) delete parent::delete(record_id) . . . itd Class News extends News_TableDB __construct <-- news_id init(news_id) AddNewEntry EditEntry DeleteEntry itd Poslednja izmena od cvele : 10. 03. 2009. u 14:45. |
"Hvala" cvele za poruku: |
10. 03. 2009. | #5 |
Banned
Knowledge base
Datum učlanjenja: 01.07.2005
Poruke: 1.598
Hvala: 206
140 "Hvala" u 89 poruka
|
jedan malo manje grub primer od pre par godina imas na mom blogu:
http://www.hazaah.com/programming/gu...e-abstraction/ ali imaj na umu da je to idalje daleko od necega sto bi trebao da drzis u produkciji, uzmi kao smernicu |
10. 03. 2009. | #6 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
Hvala, proanaliziracu sve ovo dtaljno.
pozdrav. |
10. 03. 2009. | #7 |
Ivan Dilber
Sir Write-a-Lot
|
u ovom tvom slucaju, bilo bi logicno da se Database objekat odradi kao singlton, a onda u drugoj klasi onda mozes da ga instanciras kad ti treba..
__________________
Leadership is the art of getting people to want to do what you know must be done. |
10. 03. 2009. | #8 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
@ivanhoe
U principu danas sam skontao da moram nauciti design patterne. Naletio sam na jedan tekst (http://www.imarc.net/communique/view..._php_singleton) koji pokriva otprlike ono sto je mene mucilo i to je rješeno preko singleton patterna. I nekako mi izlgeda kao 'kulturno' rješenje. Analizirao sam phpBB3 i oni su to rjesili preko globalne varijable. U common.php koji se poziva u svim ostalim fajlovima su instancirali DB i onda u drugim klasama, tacnije njihovim metodama su stavili global $db i onda hladno koriste metode DB klase. Koliko sam shvatio ovo narusava neke principe OOP! Koliko je ovo zaista lose rješenje? |
10. 03. 2009. | #9 |
profesionalac
Qualified
|
Koje principe narušava?
Ja već dosta dugo koristim taj fazon. u index.php napravim objekte za smarty, db, user i još koješta potrebnog, a u raznim metodama samo po potrebi pozovem te objekte - global $db, $smarty; Što se mene tiče, tu nema ničeg lošeg, sasvim jednostavno, jasno i radi
__________________
www.salebab.net |
11. 03. 2009. | #10 |
133t
Master
|
mozda tako mozes dok radis sam, cekaj dok se neko drugi dohvati tvojih metoda pa krene da definise lokalne varijable sa tim istim imenima.
zato ili singleton pa $db = Database::getInstance(); ili $db = new Database(); ja nekako mrzim singleton... :P a i mrzi me da svuda pravim novi $db (ovako ili onako), tako da posto mi sve i onako extenduje Model klasu to uradim jedom u njoj, pa to dodelim na $this->db; i to bude dostupno svuda.. a ne mrzi me da pisem $this->db->getRow('bla bla...'); bar znam da necu da se pokacim ni sa kakvom lokalnom varijablom. |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
C#, interfejsi i apstraktne klase | Ivan | Sva početnička pitanja | 5 | 04. 11. 2008. 11:00 |
Stila CSS klase se prikazuje u IE, ali ne i u Firefoxu | rookey | Sva početnička pitanja | 6 | 23. 12. 2007. 03:51 |
file_put_contents() iz klase? | Bojan Zivanovic | PHP | 5 | 09. 06. 2005. 20:05 |