Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] private function __construct i tworzenie Singletona
Forum PHP.pl > Forum > PHP
Pucy
Witam, mam problem. Mianowicie chcialbym zabezpieczyc klase przed stworzeniem jej obiektu (w sensie public) ale potrzebuje jej singletona (instancji klasy). Czy to jest wykonalne?

  1. class Message {
  2.  
  3. /**
  4.   * Instancja obiektu klasy
  5.   * @var instance
  6.   */
  7. private static $instance;
  8.  
  9. /**
  10.   * Konstruktor klasy nie pozwalający na utworzenie obiektu klasy
  11.   *
  12.   * @access private
  13.   * @return void
  14.   */
  15. private function __construct() {
  16.  
  17. //return $this;
  18. }
  19.  
  20. /**
  21.   * Tworzenie Singletona
  22.   *
  23.   * @return instance
  24.   */
  25. private static function &getInstance()
  26. {
  27. if(empty(self::$instance))
  28. {
  29. self::$instance = new Message();
  30.  
  31. }
  32.  
  33. return self::$instance;
  34. }
  35.  
  36. }


W tym typadku nie moge stworzyc instancji obiektu poniewaz konktruktor jest private.

Probowalem dac private static __construct() {} a pozniej self::__construct(); ale to nie pyka. Jest jakis sposob
Mephistofeles
Czemu nie możesz? Poszukałem trochę i każda ze znalezionych implementacji ma prywatny konstruktor, a (podobno) działa.
Crozin
1. Wywal "&" sprzed getInstance() - obiekty są domyślnie przekazywane przez referencje.
2. Nie, w PHP tego nie zrobisz - brakuje mu klas wewnętrznych czy "pakietowych".
Fifi209
Konstruktor może być prywatny, na pewno nie statyczny.
Co do getInstance powinno być publiczne i statyczne.

Robisz tak:
  1.  
  2. class Test {
  3.  
  4. private function __construct() {}
  5.  
  6. public static function singleton() {
  7. static $handle;
  8.  
  9. if (!isset($handle)) {
  10. $handle = new Test;
  11. }
  12.  
  13. return $handle;
  14. }
  15.  
  16. }


Chyba coś takiego o ile dobrze pamiętam.
Pucy
private function __construct()


a pozniej uzyc new self();
Fifi209
Cytat(Pucy @ 26.11.2010, 11:08:36 ) *
private function __construct()


a pozniej uzyc new self();

Na siłę jak podałem działający przykład.
Mephistofeles
Nie zauważyłem, faktycznie masz prywatną metodę getInstance, więc jak to ma działać? Zrób ją publiczną i powinno być dobrze.
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.