Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [Jadro] komunikacja miedzy klasami
emigo
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 6.10.2004
Skąd: Wschodnia Polska

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
matid
post
Post #2





Grupa: Zarejestrowani
Postów: 362
Pomógł: 0
Dołączył: 18.02.2004
Skąd: Knurów

Ostrzeżenie: (0%)
-----


Poczytaj sobie o czymś takim jak Singleton.
Go to the top of the page
+Quote Post
emigo
post
Post #3





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 6.10.2004
Skąd: Wschodnia Polska

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 10:36