Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Singleton jako klasa ustawien, jak przy tworzeniu prawidlowo ustawic dane
Forum PHP.pl > Forum > Przedszkole
karmelik
Mam wzór klasy z uzyciem wzorca Singleton:
  1. class Config{
  2.  
  3. private static $instance;
  4.  
  5. private $config = array();
  6.  
  7. private function __construct() {}
  8. private function __clone() {}
  9.  
  10. public static function getInstance() {
  11. if(self::$instance === null) {
  12. self::$instance = new Config();
  13. }
  14. return self::$instance;
  15. }
  16.  
  17. }


Teraz chcialbym zeby przechowywala ona ustawienia aplikacji ktore pobieram z bazy danych (czyli inna klasa to pobiera). Ze wzgledu na poczatki z wzorcami projektowymi, pytanie jak przerobic ta klase zeby mozna bylo ja wywolac razem z danymi wejsciowymi. W konstruktorze, w getInstance ? czy moze utworzyc metode ktora bedzie zapisywala dane wejsciowe juz po utworzeniu instancji. Mysle ze wszystkimi sposobami daloby rade, ale ktory jest prawidlowy ? Wolalbym nie robic profanacji juz od poczatku wink.gif

Edit: chodzi mi tylko o podpowiedz "któredy" powinno sie wgrywac dane do klasy. Sam sobie napisze wszystko tylko któredy zrobic to zeby bylo prawidlowo.
Pyton_000
__construct
karmelik
Sporo mi z tym zeszło ale w koncu doszedlem, moze sie komus przyda:
  1. class Config{
  2.  
  3. private static $instance;
  4.  
  5. private $config = array();
  6.  
  7. private function __construct(array $config) {
  8. $this->config = $config;
  9. }
  10. private function __clone() {}
  11.  
  12. public static function getInstance(array $config) {
  13. if(self::$instance === null) {
  14. self::$instance = new Config($config);
  15. }
  16. return self::$instance;
  17. }
  18.  
  19. }
Pyton_000
Nie do końca.

Jeżeli to jest klasa stricte do configa to w samym konstruktorze powineneś zadbać o pobieranie danych.

Co jak będziesz w 1000 miejscach używam Config::getinstance();
To co za każdym razem masz tam przekazywać konfiguracje? Bez sensu.
Możesz co najwyżej przekazać obiekt który zajmie się importem konfiguracji do Singletonu, albo nawet nic nie przekazywać. Niech Singletn sam sobie pobierze dane jak chce.
karmelik
Właśnie nie wiem jak to zrobić. Musiałbym zrobić tak:

  1. public static function getInstance() {
  2. if(self::$instance === null) {
  3. $db = new Database();
  4. $config = $db->pobierz_konfiguracje();
  5. self::$instance = new Config($config);
  6. }
  7. return self::$instance;
  8. }


czyli drugi raz wykorzystac klase do polaczenia i obslugi bazy danych, drugi raz ja zainicjowac. Ewentualnie stworzyc nowa klase tylko do pobierania ustawien ktora rozszerza klase do polaczenia bazy danych. Ewentualnie zrobic klase Database jako singleton i z niej korzystac ? Albo moze ja klonowac ? Nie wiem kurcze jak do tego podejsc zeby klasy same sobie radzily i nie inicjowac pare razy tych samych klas w innych klasach :/ dopiero poczatkuje w klasach i wzorcach projektowych :/ Podrzuc prosze jakies pomysly.
com
To już Ci napisał Pyton_000
Więc jeszcze raz zacytuje
Cytat
w samym konstruktorze powineneś zadbać o pobieranie danych

A nie w getInstance()
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.