Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Jadro] komunikacja miedzy klasami
Forum PHP.pl > Forum > PHP
emigo
Witam wszystkich na forum,

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:

  1. <?php
  2. // file kernel/class_engine.php
  3.  
  4. class engine extends Smarty {
  5. const PATH = 'c:/strony/jadro/'; // path to the main directory with ending slash
  6. const URL = 'http://127.0.0.1/jadro/'; // path to the main http directory with ending slash
  7. public $parameters;
  8. public $moduleName;
  9. public $moduleFile;
  10.  
  11. function __construct()
  12. {
  13. $this->moduleName = 'news'; // pobieramy go z URL
  14. $this->moduleFile = 'moduly/news/news.php' // nazwa pliku glownego z modulem
  15. $this->parameters = array('display','2'); // parametry GET
  16.  
  17. $this->Smarty();
  18. $this->template_dir = engine::PATH . 'templates/';
  19. $this->compile_dir = engine::PATH . 'smarty/templates_c/';
  20. $this->config_dir = engine::PATH . 'smarty/configs/';
  21. $this->cache_dir = engine::PATH . 'smarty/cache/';
  22. $this->caching = false;
  23. } 
  24.  
  25. // (...) kilka mniejszych funkcji
  26. }
  27. ?>



  1. <?php
  2. // file kernel/class_session.php
  3.  
  4. class session {
  5. public $id;
  6. private $name = 'ses';
  7.  
  8. function __construct()
  9. {
  10. ini_set('arg_separator.output', '&amp;');
  11. session_name($this->name);
  12. $this->id = session_id();
  13. } 
  14. }
  15.  
  16. // file kernel/class_db.php
  17.  
  18. class db {
  19. // tutaj metody connect, query etc.
  20. }
  21. ?>


  1. <?php
  2. // przykladowy modul (modules/news/news.php)
  3.  
  4. class news {
  5. public $templateFile;
  6.  
  7. function __construct() {
  8. // w zaleznosci od wlasciwosci $parameters klasy engine podejmij wybrana akcje (np. display)
  9. // czyli np. if ($parameters[0]=='display' && is_integer($parameters[1])) {
  10. // $this->display($parameters[1]);
  11.  // }
  12. }
  13.  
  14. // kilka metod jak display, comments etc
  15.  
  16. }
  17. ?>



Teraz uzycie:

  1. <?php
  2. require('kernel/class_engine.php');
  3. $site=new engine;
  4. $session=new session; // dzieki autoload automatycznie zaladuje potrzebny plik z klasa
  5. $db=new db; // j.w.
  6. $db->connect();
  7. include($site->moduleFile); // ladujemy plik z klasa modułu news
  8. $module = new $site->moduleName; // uruchamiamy klase z modulem, czyli np. $module = new news;
  9.  
  10. // teraz wykonuje sie metoda __construct, ktora powinna uruchamiac kolejna metode 
  11. lasy news, w zaleznosci od parametrow $_GET
  12.  
  13.  
  14. $db->close();
  15. $site->display($module->templateFile);
  16.  
  17. ?>



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..
matid
Poczytaj sobie o czymś takim jak Singleton.
emigo
Dzięki za odpowiedź, poczytałem na tymże forum o singletonie no i zaczęło mi działać, ale mam jeszcze kilka pytań, gdyż nie wiem czy robię dobrze..

Dopisałem do klasy engine i db metodę getInstance, która zwraca instancję tejże klasy. I teraz w klasie news robię tak:

  1. <?php
  2.  
  3. class news {
  4. public $site; 
  5. private $db;
  6.  
  7. function __construct()
  8. {
  9. $this->site = engine::getInstance();
  10. $this->db = sqlite::getInstance();
  11. $this->site->templateFile = engine::PATH . 'modules/' . $this->site->moduleName . '/' . $this->site->moduleName . '.tpl';
  12. $this->getNews();
  13. } 
  14. // (...)
  15. }
  16. ?>


Jak widać - pobieram instancje klas engine i sqlite, i przypisuje je do wlasciwosci klasy news ($site i $db). Teraz gdy w metodzie getNews() chce odwolac sie np. do metody klasy $db musze robic tak:

  1. <?php
  2. $this->db->query('select costam from costam');
  3. ?>


Da sie to jakos ominac, tzn. abym mógł sobie wywoływac $db->query(), a nie $this->db->query() ? Wydaje mi się, że jedyną taką możliwością jest tworzenie w każdej metodzie klasy news instancji do engine/sqlite. Czyli w ten sposob:

  1. <?php
  2. class news {
  3. // (...)
  4. private function getNews()
  5. {
  6. $site = engine::getInstance();
  7. $db = sqlite::getInstance()
  8. $db->query('costam');
  9. } 
  10.  
  11. private function addNews()
  12. {
  13. $site = engine::getInstance();
  14. $db = sqlite::getInstance()
  15. $db->query('costam');
  16. } 
  17. }
  18. ?>


Co jednak nie jest zbyt wygodne...

Mam też taki problem:

Gdy robie cos takiego:

  1. <?php
  2. class news {
  3. // (...)
  4. private function getNews()
  5. {
  6. $this->site->templateFile = 'szablonik.tpl';
  7. } 
  8. }
  9. ?>


A nastepnie w pliku index.php dam:

  1. <?php
  2. $site = new engine;
  3. $session = new session;
  4. $db = new db;
  5. $db->connect();
  6. $module = new news;
  7.  
  8. // tutaj zostanie uruchomiona funkcja getNews, ktora przypisze wartosc wlasciwosci
  9. $this->site->templateFile;
  10.  
  11. echo $site->templateFile;
  12. // powyzsza linijka nic nie wyswietli.. - a chcialbym aby bylo inaczej;-)
  13. ?>


Chodzi o to, że w klasie news tworzę instancję klasy engine, następnie przypisuję ją właściwości klasy news, potem robię $this->site->templateFile='szablonik.tpl' i wlasciwosc templateFile zmienia sie tylko gdy wywolam ja z wewnatrz, tzn. $this->site->TemplateFile - dziala, a $site->templateFile (wywolane z zewnatrz) - nie dziala.

Kurcze.. chyba troche niezrozumiale napisalem.. Moze jednak po krotkiej analizie kodu stanie sie to jasne - jesli nie, postaram sie napisac jasniej.

Z gory dzieki za pomoc i przepraszam ze tak zamieszalem..
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.