Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php]Problem z obiektami
Forum PHP.pl > Forum > PHP
ujex
Witam.
Przyznam, że dopiero się uczę pisać obiektowo i na samym początku mam problem....
Chodzi mi o coś takiego jak globalny dostęp do obiektu (np połaczenie z baza, config, czy chociażby smarty) obiekty te muszą być dostępne w innych klasach np user, która zajmuje się użytkownikami. Jak patrzyłem na kod PHPBB3 to tam każdy obiekt potrzebny w danej metodzie jest poprostu globalny (global $smarty, $config) ale z tego co poczytałem to takie podejście jest "fuj":)
Czytałem trochę o wzorcu Singelton ale nie wiem jak by go użyć obiektu w innej klasie

Jak ktoś ma chwilke to niech odpisze:)
mike
Załóżmy, że masz klasę Config, która jest realizacją wzorca Singleton oraz posiada metodę dostępową getInstance(). Jeśli chcesz w jakimkolwiek miejscu (w metodach innych klas również) pobrać ten obiekt to piszesz najzwyklej.
  1. <?php
  2.  
  3. $obiektConfig = Config::getInstance();
  4.  
  5. ?>
ujex
dzięki
ale jeszcze taka sprawa jak korzystam z biblioteki smarty to nie mogę tego zrobić, chyba że przebuduje ich klase:)
jest na to jakiś sposób? czy lepiej napisać swoje szablony:)
mike
Cytat(ujex @ 16.12.2007, 09:59:28 ) *
jest na to jakiś sposób?
Napisz swoją klasę MySmarty, która dziedziczy po Smarty, ale w odróżnieniu od niej jest już singletonem.
ujex
Zrobiłem tak:
  1. <?php
  2. $objConfig = ServiceConfig::getInstance();
  3. ?>


ServiceConfg:

  1. <?php
  2. class ServiceConfig{
  3.  
  4. static private $_instance;
  5.  
  6. public $variables = 'cos tam';
  7.  
  8.  
  9. private function __construct(){ }
  10.  
  11. private function __clone(){ }
  12.  
  13. static function getInstance()
  14. {
  15. if(!self::$_instance) {
  16. self::$_instance = new ServiceConfig();
  17. }
  18. return self::$_instance;
  19. }
  20.  
  21.  
  22. public function getVar()
  23. {
  24. return $this->variables;
  25. }
  26. .
  27. .
  28. .
  29. .
  30. .
  31. ?>


i teraz klasa użytkownika:
  1. <?php
  2. class GuestUser extends User{
  3.  
  4. /**
  5.  * Konstruktor
  6.  */
  7. function __construct ($db)
  8. {
  9. print_r($objConfig->getVar());
  10. }
  11. .
  12. .
  13. .
  14. ?>


i wyskakuje błąd:

Fatal error: Call to a member function getVar() on a non-object in /home/hunki/ftp/html/hunki_eu/_hcms/include/class/users/GuestUser.php on line 20

coś chyba pochrzaniłem biggrin.gif
mike
Ale jak zrobisz sobie obiekt $objConfig to on nie jest globalny.
Za każdym razem kiedy chcesz z niego skorzystać to pobierasz:
  1. <?php
  2. class GuestUser extends User{
  3.  
  4. /**
  5.  * Konstruktor
  6.  */
  7. function __construct ($db)
  8. {
  9. $objConfig = ServiceConfig::getInstance();
  10. print_r($objConfig->getVar());
  11. }
  12. ?>
ujex
withstupidsmiley.gif
hehe no tak:d
wielkie dzięki

i jeszcze ostatnia rzecz:

wywoływać w każdej metodzie taki kod:
  1. <?php
  2. $objConfig = ServiceConfig::getInstance();
  3.  
  4. ?>


czy tworzyc właściwość w danej klasie i przez nią się odwoływac??
mike
Cytat(ujex @ 16.12.2007, 11:03:55 ) *
wywoływać w każdej metodzie taki kod:
  1. <?php
  2. $objConfig = ServiceConfig::getInstance();
  3.  
  4. ?>
czy tworzyc właściwość w danej klasie i przez nią się odwoływac??
Jak Ci wygodnie. To już kwestia rozsądku.
Jeśli korzystasz z tairgo obiektu w jednym, może dwóch miejscach to właściwość nie jest Ci potrzebna.
Jeśli częściej to będzie wygodniej trzymać to we właściwości.
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.