abc Posted March 5, 2012 Report Share Posted March 5, 2012 Mēģinu izveidot kaut ko līdzīgu primitīvam mvc frameworkam, bet saskāros ar problēmu. abstract class Model{ protected $db; public function __construct(){ // izveidojam datubāzes konekciju $this->db = new Database(array( 'host' => 'localhost', 'user' => 'test', 'pass' => 'pass', 'name' => 'test', )); echo "connecting to db\n"; } } class News_Model extends Model{ public function getNewsList(){ } } class Page_Model extends Model{ public function getPageList(){ } } new News_Model(); new Page_Model(); Pēc šī koda izpildes sanāk, ka tiek taisītas divas konekcijas datubāzei, jo Model klases konsrtuktors tiek izpildīts divas reizes. Ja ir vajadzība piekļūt tikai vienam modelim, tad viss ir kārtībā, bet ar vairākiem modeļiem sākās problēmas. Varētu katram modelim padot atsevišķi to datubāzes objektu, bet varbūt ir citi varianti? Quote Link to comment Share on other sites More sharing options...
codez Posted March 5, 2012 Report Share Posted March 5, 2012 Vienkāršākais variants - uztaisi, ka datobāzes instanci iegūsti no Db klases singletona, savukārt klases lādē ar autoload. Tad model klasēs varēsi izmantot: DB::instance()->query(...); un nebūs ne problēmas ar inicializāciju, ne piekļuvi instancei. Quote Link to comment Share on other sites More sharing options...
Kaklz Posted March 5, 2012 Report Share Posted March 5, 2012 Cita starpā es attiecīgās metodes tavā piemērā sauktu getList(): class News_Model extends Model{ public function getList(){ } } class Page_Model extends Model{ public function getList(){ } } Tad pēc tam nebūtu jādomā par to, kāds nu kurai metodei nosaukums, jo objekta nosaukums jau ir klases nosaukumā - News/Page: $pages = new Pages_Model(); var_dump($pages -> getList()); Quote Link to comment Share on other sites More sharing options...
daGrevis Posted March 6, 2012 Report Share Posted March 6, 2012 Pietam, kāpēc metodes ir camelCase, bet klašu nosaukumi - under_score? Būtu labi pieturēties pie viena standarta un arī tad to izmantot. :) **Labojums:** Arī **codez** minētais singlton patterns nav tas labākais veids. Varbūt apskati kā darbojas dependency-injection. Te pat ir piemērs! http://stackoverflow.com/questions/7975174/php-multiple-different-databases-dependency-injected-class Quote Link to comment Share on other sites More sharing options...
codez Posted March 6, 2012 Report Share Posted March 6, 2012 (edited) daGrevis, dependancy injection, ne veic tās darbības, kuras veic singletona paterns, ne aizstāj to. Tie ir divi dažādi paterni, kas veic dažādas funkcijas un var tikt izmantoti kā atsevišķi, tā kopā. Bet šijā gadījumā sigletona paterna izmantošana pret dependancy-injection ar tavu norādīto piemēru ir labāka, jo: 1) var izmantot lazy loading un lazy inicialization, kas nozīmē, ka DB klase tik ielādēta tikai un vienīgi, ja tā tiks izmantota un tāpat arī iniciazlizēta tā tiks tikai un vienīgi tad, ja tā tiks izmantota. Kamēr tavā piedāvātajā variantā vai inicializācija pašam ir manuāli katriez jāveic, vai arī tā notiek arī tad, kad tā nav vajadzīga. 2) Nav jāraksta lieks abstrakcijas slānis kā depenendancy-injection, jo 99% gadījumu visi izmanto viena veida datubāzi, kas lielākoties ir mysql. Edited March 6, 2012 by codez Quote Link to comment Share on other sites More sharing options...
daGrevis Posted March 6, 2012 Report Share Posted March 6, 2012 Laikam būs tev jāpiekrīt par pirmo argumentu... :) Quote Link to comment Share on other sites More sharing options...
mirsā_dati Posted March 8, 2012 Report Share Posted March 8, 2012 Datubāzes 'konekciju' ņem ārā no tās klases un padod konstruktoram jau gatavu. Tavam 'modelim' nav jāzin, kas tā ir par konekciju. Var vēl izvērsties fleimā, vai modelim būtu jāatbild par datu izvilkšano no datu avota (datubāzes) Tavā gadījumā. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.