Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Centralizacja konfiguracji a klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
Lewiatan
Witam

Chciałbym się zorientować jakie są możliwości jeśli chodzi o centralizację konfiguracji i wykorzystywanie jej zmiennych bezpośrednio w klasach. Otóż stworzyłem sobie pliczek, załóżmy config.php i zrobiłem tam tablicę, np:
  1. $config['db']['host'] = 'localhost';
  2. $config['db']['user'] = 'user';
  3. $config['db']['pswd'] = 'hasieł';
  4. $config['db']['baza'] = 'baza';


dalej mam klasę dostępową do bazy danych, taki tam banał, ale problem jest z przekazaniem zmiennych bezpośrednio do klasy np. w taki sposób:
  1.  
  2. require_once('./config.php');
  3.  
  4. class baza
  5. {
  6. private $host; //host
  7. private $user; // użytkownik
  8. private $pswd; // hasło
  9. private $baza; //baza danych
  10. private $db;
  11. private $affected_rows = 0;
  12.  
  13. public function __construct()
  14. {
  15. $this->host = $config['db']['host'];
  16. $this->user = $config['db']['user'];
  17. $this->pswd = $config['db']['pswd'];
  18. $this->baza = $config['db']['baza'];
  19. }
  20. }


Do tej pory zmienne konfiguracyjne ustawiałem w każdej klasie z osobna.

Pomyślałem, że można zrobić klasę, tam zdefiniować tablice z danymi konfiguracyjnymi i utworzyć metody dostępowe żeby zwracały tablicę, coby dostęp wyglądał np. tak:
  1. class baza
  2. {
  3. private config = array();
  4. private $db;
  5. private $affected_rows = 0;
  6.  
  7. public function __construct()
  8. {
  9. $conf = new Config();
  10. $this->config = $conf->getDbConfig();
  11. }
  12. }


Pytanie jest następujące: jakie są dobre możliwości rozwiazania tego problemu? Bo czytałem, że define raczej powinno się unikać.
Crozin
Podstawy OOP - obiekt nie powinien się w jakiś automagiczny sposób samoistnie konfigurować. Konfiguracja musi być przekazana mu z zewnątrz, czyli:
  1. public function __construct($host, $user, $password, $database) {
  2. ...
  3. }
Jeżeli zmiennych konfiguracyjnych jest za dużo (konstruktor z 10-oma argumentami to zła rzecz) możesz utworzyć jakiś obiekt reprezentujący konfigurację dla danego obiektu, czyli:
  1. public function __construct(DatabaseConfiguration $config) {
  2. ...
  3. }
Lewiatan
Cytat(Crozin @ 21.03.2011, 18:19:48 ) *
Podstawy OOP - obiekt nie powinien się w jakiś automagiczny sposób samoistnie konfigurować. Konfiguracja musi być przekazana mu z zewnątrz, czyli:
  1. public function __construct($host, $user, $password, $database) {
  2. ...
  3. }
Jeżeli zmiennych konfiguracyjnych jest za dużo (konstruktor z 10-oma argumentami to zła rzecz) możesz utworzyć jakiś obiekt reprezentujący konfigurację dla danego obiektu, czyli:
  1. public function __construct(DatabaseConfiguration $config) {
  2. ...
  3. }

No rozumiem. Tak myślałem, że jest możliwość przekazania tego przez konstruktor (w zasadzie to pierwsze przyszło mi do głowy) ale znowu średnio mi się jakoś widzi za każdym wywołaniem przekazywać zmienne bądź obiekt w konstruktorze. Liczyłem na to że jest jakiś bardziej "elegancki" sposób wink.gif
Zyx
To jest właśnie elegancki sposób. Zacznij pisać testy automatyczne lub używać kodu wielokrotnie, to się o tym sam przekonasz smile.gif.
Lewiatan
OK, a ten sposób który napisałem na początku, żeby obiekt był tworzony przez konstruktor a nie przesyłany do konstruktora też się nada? tongue.gif
Crozin
Wtedy równie dobrze możesz na stałe wpisać sobie konfigurację w kod klasy, bo przecież nie będzie możliwości żadnego sensownego zmieniania tych ustawień.
Cytat
[...] ale znowu średnio mi się jakoś widzi za każdym wywołaniem przekazywać zmienne bądź obiekt w konstruktorze [...]
A ile to masz obiektów odpowiedzialnych za połączenie z bazą danych na stronie? Zapewne jeden, może dwa.
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.