Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Instancja klasy miesza się z instancją innej klasy..., ... jak to możliwe? ...
Babcia@Stefa
post 16.03.2009, 21:07:40
Post #1





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


Witam, napisałem sobię TRZY klasy;

- SearchInterface (Tak naprawdę to Singleton + jedna funkcja do obsługi błędów jak narazie)
- GoogleSearch
- RapidMegaSearch

Oto testowe zastosowanie:

  1. <?php
  2. $GoogleSearch = GoogleSearch::getInstance('GoogleSearch');
  3.  
  4. $GoogleSearch -> Query($Query, 1);
  5. $GoogleSearch -> ParseResults();
  6. $GoogleResults = $GoogleSearch -> Results();
  7.  
  8. $Search = RapidMegaSearch::getInstance('RapidMegaSearch');
  9. ?>


Klasa SearchInterface:
  1. <?php
  2. abstract class SearchInterface
  3. {
  4.   private static $instance;
  5.   protected $ErrorLevel;
  6.   private function __construct() {}
  7.   private function __clone(){}
  8.  
  9.   public static function getInstance ($Classname)
  10.    {
  11.    echo '<h1><font color="red">' .get_class(self::$instance). ' dla ' .$Classname. '</font></h1>';
  12.        if (self::$instance === null) {
  13.            self::$instance = new $Classname();
  14.        }
  15.        return self::$instance;
  16.    }
  17.  
  18.    protected function FailOnScreen ($inMsg='Unknown', $inFunction='Not specified', $inCondition='Unknown', $inErrorNumber)
  19.    {
  20.        if($this->ErrorLevel == 'exception')
  21.        {
  22.            throw new Exception ('TestXY triggered an error. Message says "' . $inMsg . '", triggered from function "' . $inFunction . '" by condition "' .$inCondition. '".', $inErrorNumber);
  23.        } elseif ($this->ErrorLevel == 'trigger') {
  24.            trigger_error('TestXY error. Message says "' . $inMsg . '", triggered from function "' . $inFunction . '" by condition "' .$inCondition. '", error number: ' .$inErrorNumber, E_USER_WARNING);
  25.        }
  26.    }
  27. }
  28.  
  29. ?>


OBIE KLASY (GoogleSearch i RapidMegaSearch) DZIEDZICZĄ po SearchInterface, ale kiedy utworzę instancję klasy GoogleSearch, to przy tworzeniu instancji klasy SearchInterface instancja nie jest tworzona instancja klasy SearchInterface tylko zwracana jest GoogleSearch...

Jeśli nie rozumiesz powyższego zdania, oto rysunek pomocniczy smile.gif



W klasie SearchInterface umieściłem:
  1. <?php
  2. echo '<h1><font color="red">' .get_class(self::$instance). ' dla ' .$Classname. '</font></h1>';
  3. ?>


I zwraca dla przykładu podanego wyżej:
Cytat
dla GoogleSearch
GoogleSearch dla RapidMegaSearch


Jak widać:
- Tworzona jest instancja GoogleSearch
- Przy próbie dostępu do nie istniejącej jeszcze instancji klasy RapidMegaSearch zwracana jest instancja klasy GoogleSearch.

Moje pytanie:
- Jak to wszystko naprawić? Chcę aby każda klasa zwracała Swoją instnację - czyli tak jak powinno być...

Pozdrawiam, WebNuLL

Ten post edytował Babcia@Stefa 16.03.2009, 21:15:50


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
starach
post 16.03.2009, 21:18:40
Post #2





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


Właśnie dlatego należy pisać dla każdej klasy wykorzystującej ten wzorzec oddzielną implementację.

Jedna jeśli się upierasz przy tym, to zrób ze zmiennej $instance zmienna tablicową której indeksami będą wartości przekazywane do getInstance()
Go to the top of the page
+Quote Post
Babcia@Stefa
post 16.03.2009, 21:21:22
Post #3





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

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


orglee, z tą tablicą to nawet ŚWIETNY pomysł - sam nie pomyślałem, dzisiaj jakoś nie myślę biggrin.gif

Dzięki, szybko sprawdzę i napiszę czy działa, ale raczej powinno winksmiley.jpg

@edit

Działa winksmiley.jpg

Pozdrawiam, WebNuLL

Ten post edytował Babcia@Stefa 25.03.2009, 15:05:46


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 19.04.2024 - 20:42