Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Instancja klasy miesza się z instancją innej klasy...
Forum PHP.pl > Forum > PHP > Object-oriented programming
Babcia@Stefa
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
starach
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()
Babcia@Stefa
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
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.