Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] private function __construct i tworzenie Singletona
Pucy
post 25.11.2010, 22:19:01
Post #1





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


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


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post
Mephistofeles
post 25.11.2010, 22:26:34
Post #2





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Czemu nie możesz? Poszukałem trochę i każda ze znalezionych implementacji ma prywatny konstruktor, a (podobno) działa.
Go to the top of the page
+Quote Post
Crozin
post 25.11.2010, 22:30:22
Post #3





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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".
Go to the top of the page
+Quote Post
Fifi209
post 26.11.2010, 08:12:57
Post #4





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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.

Ten post edytował fifi209 26.11.2010, 08:16:13


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Pucy
post 26.11.2010, 11:08:36
Post #5





Grupa: Zarejestrowani
Postów: 124
Pomógł: 0
Dołączył: 8.05.2006

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


private function __construct()


a pozniej uzyc new self();


--------------------
TESTWIEDZY.PL - Przetestuj swoją wiedzę...

Nie ma rzeczy niemożliwych. Niemożliwe wymaga jedynie więcej czasu...
Pracujemy na Ciebie! - MINDFLOW.PL
Go to the top of the page
+Quote Post
Fifi209
post 26.11.2010, 11:39:37
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
Mephistofeles
post 26.11.2010, 13:46:50
Post #7





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Nie zauważyłem, faktycznie masz prywatną metodę getInstance, więc jak to ma działać? Zrób ją publiczną i powinno być dobrze.
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: 10.08.2025 - 13:09