Przerzucilem sie niedawno na php5 i przy okazji budowy nowej strony postanowilem przepisac od nowa moje jadro i zadbac by bylo ono calkowicie obiektowe. No i tak zaczalem kodowac wg. tego co mialem dawniej, az natrafilem na problem komunikacji wewnatrz calego systemu. Okazalo sie ze nie jest to takie proste (przynajmniej dla mnie, slabego z OO), dlatego chcialbym prosic Was o pomoc.
W chwili obecnej wyglada u mnie to tak:
<?php // file kernel/class_engine.php class engine extends Smarty { const PATH = 'c:/strony/jadro/'; // path to the main directory with ending slash const URL = 'http://127.0.0.1/jadro/'; // path to the main http directory with ending slash public $parameters; public $moduleName; public $moduleFile; function __construct() { $this->moduleName = 'news'; // pobieramy go z URL $this->moduleFile = 'moduly/news/news.php' // nazwa pliku glownego z modulem $this->Smarty(); $this->template_dir = engine::PATH . 'templates/'; $this->compile_dir = engine::PATH . 'smarty/templates_c/'; $this->config_dir = engine::PATH . 'smarty/configs/'; $this->cache_dir = engine::PATH . 'smarty/cache/'; $this->caching = false; } // (...) kilka mniejszych funkcji } ?>
<?php // file kernel/class_session.php class session { public $id; private $name = 'ses'; function __construct() { } } // file kernel/class_db.php class db { // tutaj metody connect, query etc. } ?>
<?php // przykladowy modul (modules/news/news.php) class news { public $templateFile; function __construct() { // w zaleznosci od wlasciwosci $parameters klasy engine podejmij wybrana akcje (np. display) // czyli np. if ($parameters[0]=='display' && is_integer($parameters[1])) { // $this->display($parameters[1]); // } } // kilka metod jak display, comments etc } ?>
Teraz uzycie:
<?php require('kernel/class_engine.php'); $site=new engine; $session=new session; // dzieki autoload automatycznie zaladuje potrzebny plik z klasa $db=new db; // j.w. $db->connect(); include($site->moduleFile); // ladujemy plik z klasa modułu news $module = new $site->moduleName; // uruchamiamy klase z modulem, czyli np. $module = new news; // teraz wykonuje sie metoda __construct, ktora powinna uruchamiac kolejna metode lasy news, w zaleznosci od parametrow $_GET $db->close(); $site->display($module->templateFile); ?>
Mam nadzieje ze jest to dosyc jasne, do takiego rozwiazanie teraz doszedlem, jednak uwazam iz cos robie zle - zapewne da sie to inaczej (lepiej) rozwiazac. Chcialbym bowiem w klasie news miec dostep do metod klasy $db, nie dziala mi takze $site->assign('zmienna','wartosc') (klasa site jest extends Smarty) - jednym slowem: nie wiem jak rozwiazac ta komunikacje. Czyli aby w klasie news (i w klasach innych modulow) bez problemu operowac na $db czy na $site.. Jak to rozwiazac? Chcialbym np. za pomoca metody klasy news , zmienic wartosc wlasciwosci klasy site (engine)..
Bede wdzieczny za pomoc.. Nie wiem czy jasno napisalem, jesli nie to prosze rowniez pisac, postaram sie jasniej..