Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Czy to Singleton
Forum PHP.pl > Forum > PHP > Pro > Archiwum Pro
lesser
Potrzebowałem ostatnio klasy do przetrzymywania ustawień w aplikacji.
Zrobiłem coś takiego:

  1. <?php
  2. class Ustawienia {
  3.  
  4. private $dane = array();
  5.  
  6. private static $instance;
  7.  
  8. private function __set( $zmienna, $wartosc ) {}
  9.  
  10. private function __construct() {}
  11.  
  12.  
  13.  
  14. public static function sprawdz( $plik_ustawien ) {
  15. if( empty( self::$instance ) ) {
  16. self::$instance = new Ustawienia;
  17. $dane = new Konfigurator;
  18. self::$instance->dane = $dane->czytajPlik( $plik_ustawien );
  19. }
  20. return self::$instance;
  21. }
  22.  
  23.  
  24.  
  25. public function __get( $zmienna ) {
  26. if ( strstr( $zmienna , '_' ) !== 0 ) {
  27. return $this->dane[ $zmienna ];
  28. }
  29. $zmienna = explode( '_', $zmienna );
  30. $kat_gl = (string)$zmienna[0];
  31. array_shift( $zmienna );
  32. $kat_poch = (string)implode( '_', $zmienna );
  33. return $this->dane[$kat_gl][$kat_poch];
  34. }
  35.  
  36. }
  37. ?>

i użycie:
  1. <?php
  2. $config = Ustawienia::sprawdz( 'katalog_ustawien/ustawienia.ini' );
  3. $config->DB_host;
  4. $config->DB_login;
  5. $config->DB_haslo;
  6. ?>


I teraz pytania:
  1. Czy klasa Ustawienia to Singleton (bo z jednej strony niepowtarzalna a z drugiej przekazywanie parametru)?
  2. Czy widzi ktoś jakąś możliwość zamazania ustawień a jak tak to jaką?
Termit_
A czy jest możliwość czytania różnych plików konfiguracyjnych?
Bo jeśli teraz wywołasz
  1. <?php
  2. $config = Ustawienia::sprawdz( 'katalog_ustawien/ustawienia_testowe.ini' );
  3. ?>

to nie wczyta nowego pliku ( empty( self::$instance ) zwróci false ).

W takim wypadku proponowałbym stworzenie tablicy rekordów:
  1. <?php
  2. class Ustawienia {
  3. # (...)
  4. private static $arInstances = array();
  5. # (..)
  6.  
  7. public static function sprawdz( $plik_ustawien ) {
  8. if( !isset( self::$arInstances[$plik_ustawien] ) ) {
  9. $instance =& self::$arInstances[$plik_ustawien];
  10. $instance = new Ustawienia;
  11. $dane = new Konfigurator;
  12. $instance->dane = $dane->czytajPlik( $plik_ustawien );
  13. }
  14. return self::$arInstances[$plik_ustawien];
  15. }
  16.  
  17. # (...)
  18. }
  19. ?>
em1X
Autor troche myli pojecia:

Singleton - to nie klasa, to metodologia tworzenia oprogramowania - wzorzec.

... a skoro klasa Twoja moze byc oparta na dwoch wzorcach - Singleton i Properties - to juz inna sprawa.
lesser
em1X pisze:
Cytat
Singleton - to nie klasa, to metodologia tworzenia oprogramowania - wzorzec.

no dobrze użyłem uproszczenia.
Chodziło mi o to czy tą klase można podpiąć pod wzorzec Singleton. Bo gdzieś przeczytałem, że jeśli w funkcji sprawdzającej przekazuje się parametr to już nie jest Sinleton(uproszczenie).

Termit_ pisze:
Cytat
A czy jest możliwość czytania różnych plików konfiguracyjnych?

W założeniu miało mi to zastąpić zmienne globalne. Ustawienia mają być wczytane tylko raz i jeśli jakas klasa(uproszczenie) będzie chciała modzić i robić coś w stylu:
  1. <?php
  2. $config = Ustawienia::sprawdz( 'inny_katalog_ustawien/inne_ustawienia.ini' );
  3. ?>

to ma to olać (takie zabezpieczenie przed Ctrl + C podcas pisania kodu winksmiley.jpg ).
Teraz chciałbym wiedzieć czy jest jakajolwiek szansa zamazania tego co jest zapisanie w obiekcie podczas wykonywania sie porgramu.
Termit_
W takim razie stwórz sobie stałą i nie przekazuj w ogóle nazwy pliku jako argument:
  1. <?
  2.  
  3. define('F_CONIFG', 'katalog_ustawien/ustawienia.ini');
  4.  
  5. # (...)
  6.  
  7. class Ustawienia {
  8. # (...)
  9. public static function sprawdz() {
  10. if( empty( self::$instance ) ) {
  11. self::$instance = new Ustawienia;
  12. $dane = new Konfigurator;
  13. self::$instance->dane = $dane->czytajPlik( F_CONFIG );
  14. }
  15. return self::$instance;
  16. }
  17. # (...)
  18. }
  19.  
  20. # (...)
  21. $config = Ustawienia::sprawdz();
  22. $config->DB_host;
  23. ?>
em1X
Klasa bazujaca na wzorcu singleton to taka klasa, ktorej nie mozna stworzyc wiecej niz jeden obiekt.. po prostu :/ A czy sobie rozbudujesz o jakies parametry to co to za roznica? Skoro nie mozna tworzyc wiecej niz jeden obiekt to signelton i juz.. do czego ta rozmowa dąży ? tiredsmiley.gif
acztery
po co pisać takie coś przecież php ma wbudowana możliwość odczytu plików INI
wzkazówka : parse_ini_file" title="Zobacz w manualu php" target="_manual
lesser
em1X pisze:
Cytat
Klasa bazujaca na wzorcu singleton to taka klasa, ktorej nie mozna stworzyc wiecej niz jeden obiekt.. po prostu :/ A czy sobie rozbudujesz o jakies parametry to co to za roznica? Skoro nie mozna tworzyc wiecej niz jeden obiekt to signelton i juz.. do czego ta rozmowa dąży ?

Dzięki o to mi chodziło. Może sie zagalopowalem i napisałem na nie to forum. Może być przeniesione na przedszkole winksmiley.jpg

acztery pisze:
Cytat
po co pisać takie coś przecież php ma wbudowana możliwość odczytu plików INI

Obiekt klasy Konfigurator ( smile.gif ) odczytuje kilka rodzajów plików na podstawie rozszerzenia.
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-2024 Invision Power Services, Inc.