2012-06-11 27 views
14

Tôi muốn tạo một tệp config.php để giữ các giá trị cấu hình khác nhau thường được thay đổi từ dự án thành dự án và tôi muốn xác định lớp để giữ giá trị cấu hình trong tệp này như sau:Có quyền đặt cấu hình lớp PHP để giữ cài đặt dự án không?

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

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

và như vậy, tôi muốn xác định tất cả các giá trị như hằng bên trong lớp, và tôi sẽ gọi cho họ như sau:

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

tôi muốn biết: Liệu cách này thiết lập các cấu hình dự án là đúng? Cách này có bất kỳ khuyết điểm nào không? Và nếu nó sai, thì cách tốt nhất để làm điều này là gì?

+0

Bạn cũng có thể sử dụng 'define ('DB_VAR', 'value');' trong một số loại tệp cấu hình có thể được đưa vào tập lệnh của bạn. – Mike

+1

@mike Có tôi biết, nhưng tôi không muốn sử dụng tên liên tục một mình, tôi muốn sử dụng bất kỳ từ nào trước khi nó chỉ ra rằng đó là một giá trị cấu hình như "Config" (tên của lớp) trong ví dụ này – Amr

+0

Trong trường hợp đó, 'define ('CONFIG_DB_VAR', 'value');' – Mike

Trả lời

1

Tôi nghĩ rằng, những gì bạn muốn là 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'; 
} 

như thế. Bạn không thể gọi cho họ bằng ::, ví dụ: Config::$DB_SERVER.

Btw. thông thường bạn không viết chúng lớn như thế nếu chúng là các biến lớp. Lớn có nghĩa là globals, thường.

+2

Nếu tôi xóa từ "const" và đặt "tĩnh" thay vào đó, chúng sẽ không còn hằng số và sẽ trở thành các thuộc tính bình thường và trong trường hợp này, tôi không nên đặt "$" ở trước mỗi từ? – Amr

+4

hơn nữa, tĩnh có thể được thay đổi ... hằng số không thể ... – giorgio

+0

đúng, họ cần một '$'. Tôi thực sự nghĩ bạn chỉ nhầm lẫn cả hai từ khóa. Nếu bạn thực sự chỉ muốn hành vi không đổi thì PHP bình thường là không đặt nó trong một lớp. Nếu bạn muốn gọi nó mà không tạo đối tượng của lớp Config, thì bạn cũng sẽ cần 'static', btw. – erikbwork

8

Đó là một cách để làm điều đó, vâng. Một cách không quá tệ, IMO. Về cơ bản, lớp sẽ trở thành một tệp cấu hình, chỉ với cú pháp PHP.

Có một vài hạn chế, mặc dù:

  • Bạn không thể có const mảng hoặc đối tượng. (Khóa học, bạn không thể có hằng số toàn cầu mảng/ đối tượng, vì vậy ...) (Kể từ 5.6, bạn có thể có mảng liên tục. Tuy nhiên, không có đối tượng const. Mặc dù tôi chắc chắn bạn không thể có const nguồn lực, hoặc, vì điều đó sẽ không có ý nghĩa nhiều.)

    Bạn có thể làm việc xung quanh điều này bằng cách thực hiện một getter tĩnh cho các đối tượng (mà tất nhiên là mã để luôn trả về cùng một đối tượng) ... nhưng tôi muốn giới thiệu chống lại nó trong hầu hết các trường hợp. Nó chỉ là một lựa chọn an toàn nếu các đối tượng trong cấu hình của bạn không thay đổi theo thiết kế. (Đối tượng không được thiết kế cho bất biến là quá dễ dàng để thay đổi, thậm chí một cách tình cờ.)

    (Bên cạnh vấn đề đột biến, nó lỗi tôi có mã thực sự đang chạy trong tệp cấu hình ... nhưng chủ yếu là cá nhân tùy chọn.)

  • Lớp này có mục đích khác với mục đích khác - đó là nhằm mục đích để thay đổi cho mỗi dự án. Bạn có thể cân nhắc việc giữ lớp Config ở một nơi nào đó ngoài các lớp còn lại, giống như nơi bạn thường giữ một tệp cấu hình. Với một tệp cấu hình thực, vì bạn phân tích cú pháp khi chạy, bạn có thể giải quyết một tệp bị thiếu hoặc không hợp lệ (bằng cách chạy với cài đặt mặc định, sử dụng những phần nào có thể phân tích cú pháp và/hoặc hiển thị lỗi hữu ích). thông điệp).Nhưng khi cấu hình của bạn đang chạy dưới dạng mã PHP, bất kỳ lỗi cú pháp nào - hoặc, nếu bạn chưa tính toán nó, một lớp Config bị thiếu - sẽ dừng ứng dụng chết trong các bài hát của nó. Và nếu bạn đang chạy với display_errors tắt (được khuyến nghị trong sản xuất), vấn đề có thể ít hơn hiển nhiên.

+5

Lưu ý rằng kể từ PHP 5.6, bạn có thể có mảng trong hằng số! – Benjamin

+0

Một nhược điểm khác là khả năng kiểm tra. Bất kỳ phần tĩnh nào của mã đều khó (hoặc không thể) để giả lập đúng trong các bài kiểm tra đơn vị. – David

+0

@David: Testability không thực sự là một nhược điểm đối với hằng số lớp cấu hình so với các phương thức cấu hình khác. Tự động tải có thể làm cho một lớp cấu hình tùy chỉnh dễ dàng ... chỉ cần tải thay thế của bạn trước khi bất cứ điều gì cần nó, và có ya đi. Vấn đề là bản thân cấu hình phức tạp thử nghiệm _unit_, vì nó vốn có liên quan đến các mối quan hệ giữa các đơn vị. Về cơ bản tất cả các lược đồ cấu hình có cùng một vấn đề này khi sử dụng sai. Nếu testability là mục tiêu, thì mã init của ứng dụng của bạn (và không có gì khác) nên đọc các thiết lập cấu hình và gửi chúng tới mọi thứ khác như tham số constructor, vv – cHao

Các vấn đề liên quan