Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa konfiguracji - problem z wyborem
Forum PHP.pl > Forum > PHP > Object-oriented programming
PotasK
Witam wszystkich jako nowy użytkownik tego forum smile.gif

Siedzę ostatnio nad własnym frameworkiem i zatrzymałem się przy plikach konfiguracyjnych, więc zwracam się z pytaniem do Was.

Jaki typ konfiguracji byłby według Was najlepszy i jak najszybszy: pliki XML, INI, czy też PHP (return array(...); itd.)
Właściwie zastanawiam się nad wyborem między XML, a PHP, z czego bardziej przychylny jestem drugiej opcji, jednak tutaj pojawia się kolejny problem,
mianowicie, nie wiem jak skonstruować klasę konfiguracji:
Czy wykorzystać ArrayObject i sprawić, żeby instancja klasy reprezentowała dany plik konfiguracyjny,
czy też "ładować wszystko do jednego worka", czyli zrobić taki jakby rejestr zawierający całą konfigurację?

A przy okazji rejestrów - zaimplementowałem już rejestr (taki ogólny, do przechowywania wszelkich danych globalnie) - czy warto podczepić pod niego konfigurację?
marcio
Kazdy robi to jak chce.
Xml czy Array czy Csv lub Ini to bez roznicy co uwazasz za bardziej wygodne stosujesz.

Ja konfiguracje bibliotek trzymam w array z php-a bo w sumie maja one tylko cos wspolnego z programista, a konfiguracje komponentow i plugin-ow mam w xml bo poprostu sa dosyc duze i zeby kazdy mogl sobie sam ustawic.

Cytat
A przy okazji rejestrów - zaimplementowałem już rejestr (taki ogólny, do przechowywania wszelkich danych globalnie) - czy warto podczepić pod niego konfigurację?

Rejestr,Singleton co tylko ze chcesz jak nie uzywam ani jedngo poprostu mam cache konfiguracji i jesli juz dana konfiguracja zostala juz gdzies zaladowana to nie laduje jej x2
PotasK
Dzięki za odpowiedź.
W sumie dobry pomysł z tym cachowaniem, chociaż wydajnościowo myślę że wyjdzie podobnie jak w przypadku rejestru, ale jeszcze to sprawdzę.
A co do typu konfiguracji podsunąłeś dobrą kwestię, więc zostanę przy array, a inne typy zostawię do modułów.
Crozin
1. Definiujesz sobie interfejs w oparciu o który Twój framework będzie mógł pobierać informacje.
2. Tworzysz osobną klasę dla każdego źródła konfiguracji (XML, YAML, PHP itd.).

Przede wszystkim na start powinieneś udostępnić sobie konfigurację w XML/PHP.
marcio
Cytat
W sumie dobry pomysł z tym cachowaniem, chociaż wydajnościowo myślę że wyjdzie podobnie jak w przypadku rejestru

Tak ale np taka konfiguracje xml/ini/csv trzeba przeprasowac wiec robisz cache z przeparsowana konfiguracja do array-a z php

A to co napisal @Crozin to uwazalem za oczywiste wiec nie wspomnialem aplikacja powinna pozwalac na rozne typy konfigruacji
PotasK
No wiadomo że oczywiste biggrin.gif Mnie chodziło tylko o to, który typ wykorzystać najlepiej jako przewodni smile.gif
Crozin
XML - ze względu na wszechobecne wsparcie tego formatu, podpowiadanie/sprawdzanie składni w edytorze oraz podpowiadanie konkretnej struktury dokumentu (schema/dtd).
PotasK
To jeszcze pozostaje pytanie, czy klasę konfiguracji zrobić jako rozszerzenie ArrayObject, czy też wywoływać przy użyciu getterów i setterów?

Co do ArrayObject, chyba każdy wie jak to wygląda, ale z getterami i setterami chodzi mi o wywoływanie ustawień na zasadzie:

W pliku konfiguracyjnym:
  1. <?php
  2. return array(
  3. "mysql" => array(
  4. "host" => "localhost",
  5. "port" => 3306,
  6. "user" => "root",
  7. "password" => "",
  8. ),
  9. // itd.
  10. );
  11. ?>


I aby wywołać, np. nazwę użytkownika bazy:
  1. $oConfig = Config::load("database", Config_Array::instance());
  2.  
  3. print $oConfig->mysql->user;
Crozin
Użycie getterów i setterów, które wygeneruje Ci IDE, udostępni:
1. Pełną kontrolę nad przekazywanymi/zwracanymi wartościami konfiguracyjnymi.
2. Banalnie prostą dokumentację.
3. W pełni statyczną (czytaj: lepszą) strukturę danych - będzie się to też wiązało z koniecznością utworzenia klasy dla każdego złożonego zasobu w konfiguracji.

Cytat
I aby wywołać, np. nazwę użytkownika bazy: [...]
Skoro piszesz o OOP to raczej:
  1. $configuration = new XmlConfiguration('/path/to/file');
  2.  
  3. echo $configuration->getDatabaseConfiguration()->getUsername();
by_ikar
  1. <?php
  2.  
  3.  
  4. class Config
  5. {
  6. protected $data;
  7.  
  8. public function __construct($data = null)
  9. {
  10. $this->data = $data;
  11. }
  12.  
  13. public function __get($name)
  14. {
  15. $this->$name = new Config();
  16.  
  17. if(isset($this->data[$name]))
  18. {
  19. $this->$name = new Config($this->data[$name]);
  20. }
  21.  
  22. return $this->$name;
  23. }
  24.  
  25. public function isEmpty()
  26. {
  27. return empty($this->data);
  28. }
  29.  
  30. public function get()
  31. {
  32. return $this->data;
  33. }
  34.  
  35. public function set($data)
  36. {
  37. $this->data = $data;
  38. }
  39. }
  40.  
  41. $cfg = new Config(array(
  42. 'mysql' => array(
  43. 'host' => 'localhost',
  44. 'port' => 3306,
  45. 'user' => 'root',
  46. 'password' => null,
  47. )
  48. ));
  49.  
  50.  
  51. var_dump($cfg->mysql->get()); // return array('host' => 'localhost', 'port' => 3306, 'user' => 'root', 'password' => null)
  52.  
  53. var_dump($cfg->mysql->host->get()); // return 'localhost'
  54.  
  55. $cfg->mysql->password->set('secret');
  56. var_dump($cfg->mysql->password->get()); // return 'secret'
  57.  
  58. var_dump($cfg->mysql->notDefinded->get()); // return null


Taki tam przykład jak mógłbyś taką klasę konfiguracji w dość prosty sposób zrobić. Trochę wzorowana na działaniu klasy Zend_Config. Tam to trochę "lepiej" wygląda: http://framework.zend.com/manual/en/zend.c...troduction.html
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.