2012-06-11 23 views
14

Chcę utworzyć plik config.php do przechowywania różnych wartości konfiguracyjnych, które z reguły są zmieniane od projektu i chcę, aby zdefiniować klasę, aby zachować wartości konfiguracyjnych w tym pliku, jak poniżej:Czy można ustawić konfigurację PHP, aby zachować ustawienia projektu?

class Config { 
    const DB_SERVER = 'localhost', 
      DB_NAME  = 'abc', 
      DB_USERNAME = 'admin', 
      DB_PASSWORD = '12345', 

      WEBSITE_NAME = 'My New Website', 
      IMAGE_DIR = 'img'; 
} 

i tak dalej, chcę, aby zdefiniować wszystkie wartości jako stałe wewnątrz klasy, a ja nazywam je tak:

$connection = mysql_connect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD) or die("Database connection failed.."); 

chcę wiedzieć: Czy to sposób ustawiania konfiguracji projektu ma rację? Czy w ten sposób masz jakieś minusy? A jeśli to było złe, to jaki jest najlepszy sposób na zrobienie tego?

+0

Można również użyć 'define ('DB_VAR', 'value');' w pliku konfiguracyjnym, który może zostać dołączony do skryptu. – Mike

+1

@mike Tak, wiem, ale nie chcę używać samej stałej nazwy, chcę użyć dowolnego słowa przed nim, które wskazuje, że jest to wartość konfiguracyjna taka jak "Config" (nazwa klasy) w tym przykładzie – Amr

+0

W takim przypadku 'define ('CONFIG_DB_VAR', 'value');' – Mike

Odpowiedz

1

myślę, że to, co chcesz jest static-keyword!

class Config { 
    static $DB_SERVER = 'localhost'; 
    static $DB_NAME  = 'abc'; 
    static $DB_USERNAME = 'admin'; 
    static $DB_PASSWORD = '12345'; 

    static $WEBSITE_NAME = 'My New Website'; 
    static $IMAGE_DIR = 'img'; 
} 

tak. Nie możesz ich wywołać pod numerem ::, np. Config::$DB_SERVER.

Przy okazji. zwykle nie piszemy ich tak dużych, jeśli są to zmienne klasowe. Big oznacza zwykle globale.

+2

Jeśli usunę słowo "const" i zamiast tego wstawię słowo "static", nie będą one już stałymi i staną się normalnymi atrybutami, aw takim przypadku nie powinienem wstawiać "$" przed każdym z nich? – Amr

+4

Co więcej, statyczne można zmienić ... stałe nie mogą ... – giorgio

+0

prawda, potrzebują one '$'. Naprawdę myślałem, że po prostu pomyliłeś oba słowa kluczowe. Jeśli naprawdę chcesz tylko ciągłego zachowania, w PHP nie jest to normalne, aby nie umieścić go w klasie. Jeśli chcesz wywołać to bez tworzenia obiektu klasy Config, będziesz potrzebował również 'static', btw. – erikbwork

8

To jeden sposób, aby to zrobić. Niezbyt zła droga, IMO. Zasadniczo klasa staje się plikiem konfiguracyjnym, tylko ze składnią PHP.

Istnieje kilka wad, ale:

  • Nie można mieć const tablicami lub obiekty. (Oczywiście, nie możesz mieć obiektów o stałej globalnej ani obiektów 210, więc ...) (Od 5.6, możesz mieć stałe tablice.) Wciąż nie ma obiektów stałych, ale jestem prawie pewien, że nie możesz mieć stałych zasobów, ponieważ nie ma to większego sensu.)

    Możesz obejść ten problem przez wprowadzenie statycznego gettera dla obiektów (który oczywiście jest zakodowany, aby zawsze zwracać ten sam obiekt) ... ale polecam w większości przypadków przeciwko niemu. Jest to tylko bezpieczna opcja, jeśli obiekty w konfiguracji są niezmienne przez projekt. (Obiekty, które nie są zaprojektowane dla niezmienności, są zbyt łatwe do zmiany, nawet przypadkowo.)

    (Oprócz problemu zmienności, powoduje to, że mam prawdziwy kod roboczy w pliku konfiguracyjnym ... ale to głównie osobiste preferencji.)

  • Ta klasa ma inny cel niż reszta - to przeznaczone do zmiany jednego projektu. Możesz rozważyć utrzymanie klasy Config w innym miejscu niż reszta klas, na przykład w miejscu, gdzie normalnie przechowujesz plik konfiguracyjny.

  • Z prawdziwym plikiem konfiguracyjnym, ponieważ parsujesz go w czasie wykonywania, możesz sobie poradzić z brakującym lub nieprawidłowym plikiem (powiedzmy, uruchamiając ustawienia domyślne, używając części, które można parsować i/lub pokazując użyteczny błąd wiadomość).Ale gdy konfiguracja działa jako kod PHP, wszelkie błędy składniowe - lub, jeśli nie zaksięgowano, brak klasy Config - zatrzymają aplikację w stanie bezczynności. A jeśli używasz display_errors wyłączony (zalecane w produkcji), problem może być mniej oczywisty.

+5

Zauważ, że od PHP 5.6 możesz mieć tablice w stałych! – Benjamin

+0

Inną wadą jest testowalność. Każda statyczna część kodu jest twarda (lub niemożliwa) do fałszywej próby podczas testów jednostkowych. – David

+0

@David: Testowalność nie jest tak naprawdę wadą dla stałych klas konfiguracji względem innych metod konfiguracji. Automatyczne ładowanie może uczynić niestandardową klasę konfiguracji łatwą ... wystarczy załadować zamiennik, zanim wszystko będzie potrzebne, i gotowe. Problem polega na tym, że konfiguracja sama w sobie komplikuje testowanie _unit_, ponieważ z natury obejmuje relacje między jednostkami. Zasadniczo wszystkie schematy konfiguracji mają ten sam problem, gdy są niewłaściwie używane. Jeśli celem jest testowalność, to kod inicjujący twojej aplikacji (i nic więcej) powinien odczytać ustawienia konfiguracji i umieścić je w innych parametrach konstruktora itp. – cHao

Powiązane problemy