2010-07-17 26 views
8

Tôi nên lưu trữ cài đặt cho dự án như thế nào?

Đó là tốt hơn - sử dụng một mảng $settings với tất cả các thiết lập của tôi:

$settings['max_photos'] = 30; 
//... 

hoặc tạo ra một lớp singleton Config với tất cả các thiết lập trong nó?

Class Config { 
    private $max_photos = 30; 
    //... 
} 

Bất kỳ ví dụ điển hình nào?

Trả lời

1

Cách tốt nhất là lưu cài đặt của bạn vào một tệp. và thao tác tệp này khai báo một lớp hoạt động trên tệp

0

Nếu cài đặt dự án quá nặng thì tệp (xml tốt hơn) tốt và lớp dành riêng cho cài đặt cũng tốt.

Nếu cài đặt dự án nhỏ, thì mảng là tốt nhất, vấn đề liên quan đến I/O rất nhanh và không phát sinh.

Thậm chí bạn có thể sử dụng cơ sở dữ liệu (vấn đề chậm hơn và xác thực).

2

Hoặc sẽ hoạt động tốt, làm bất cứ điều gì bạn cảm thấy thoải mái nhất.

11

Tôi nghĩ tốt nhất nên sử dụng hằng số cho cấu hình. Ví dụ sử dụng hằng lớp:

class Config { 
    const 
    max_photos  = 30, 
    something_else = 100, 
    // ... 
    ; 
} 

echo Config::max_photos; 

Nếu bạn có PHP 5.3 bạn cũng có thể xác định chúng như hằng số toàn cầu:

const MAX_PHOTOS = 30; 

echo MAX_PHOTOS; 

Nhưng tôi nghĩ rằng đây là ít sạch và đơn giản.

Rõ ràng điều này sẽ chỉ hoạt động miễn là bạn chỉ lưu trữ các hằng số, tức là các giá trị vô hướng, không biểu hiện. Ví dụ: nếu cấu hình của bạn có chứa mảng, điều này sẽ không hoạt động nữa. Trong trường hợp này tôi sẽ sử dụng một lớp Config với thuộc tính public static:

class Config { 
    public static $per_page = 30; 
    public static $array = array(...); 
} 

echo Config::$per_page; 

Sau đó là rất giống với cách tiếp cận $config mảng, nhưng có lợi ích (hoặc đây có thể là một nhược điểm?) Mà lớp có thể truy cập từ mọi nơi bao gồm các hàm và lớp, trong khi mảng chỉ có thể truy cập trong không gian toàn cục trừ khi bạn nhập nó vào các hàm/lớp sử dụng global $config;.

+1

1 hằng số cho giá trị không đổi, sau đó bạn có thể yên tâm rằng chúng luôn được đặt, không thể thay đổi và liên tục; Các biến lớp tĩnh của fwiw mang lại hiệu năng và có thể thay đổi khi chạy. Cuối cùng, trong trường hợp bất kỳ ai đề xuất tệp cấu hình ini hoặc xml - phản hồi đơn giản là, tại sao lại lãng phí thời gian và thêm vào tải phụ không cần thiết (phân tích cú pháp đọc v.v.). – nathan

+0

cảm ơn, vâng, tôi đã nhận mảng quá: $ thiết lập [ 'ngôn ngữ'] = array ( 'eng' => 'Trong tiếng Anh, 'rus'=> 'По-русски', 'lat'= > 'Latviski' ); $ settings ['site_title'] = _ ("Tiêu đề trang web"); $ settings ['default_lng'] = 'eng'; /** * Мин. количество гололов */ $ settings ['min_votes'] = 3; /** * Кол-во пользователей, после которого регистрация только по приглашениям. */ $ settings ['invites'] = 100000; // 25000; /** * Время истечения приглашения */ $ settings ['invite_timeout'] = 86400 * 3; tôi nghĩ rằng, biến thể này là tốt hơn, cảm ơn tất cả các bạn đã giúp đỡ! – ideea

1

Nếu bạn đi cho phương pháp mảng, bạn có thể sử dụng literals mảng cho mã dễ đọc hơn một chút:

$settings = array(
    'max_photos' => 30, 
    'max_width' => 100 
    //... 
) 
1

hai xu của tôi: Sử dụng cả hai. Hầu hết các thiết lập cấu hình ứng dụng đều thuộc về một biến mảng toàn cục. Dữ liệu cấu hình cần phải truy cập được từ các phần ứng dụng đa dạng và đây là những biến toàn cầu. Và giữ mọi thứ lại với nhau trong một mảng là hợp lý nhất. Một mảng có thể được mở rộng, ví dụ: một số tùy chọn được đặt trong một config.php và phần còn lại được đọc từ config.ini chẳng hạn.

Nhưng cũng có một địa điểm cho CONSTANTS. Dòng tiền phạt để vẽ là, nếu một tùy chọn thực sự là một cái gì đó mà MIGHT thay đổi trong thời gian chạy ứng dụng, hoặc nếu nó là một giá trị cố định/ma thuật.Nếu một khi đã được thiết lập, bạn không nên thay đổi một thiết lập ứng dụng (hoặc hiển thị có thể thất bại), thì tùy chọn này không nên nằm trong mảng, nhưng được định nghĩa là hằng số. (Đó là một quy tắc giải thích của ngón tay cái, nhưng phục vụ tốt cho tôi.)

0

Tôi có xu hướng đặt các giá trị cấu hình chỉ được truy cập trên toàn cầu trong một mảng cấu hình và xác định các giá trị được truy cập ở bất kỳ đâu. Ví dụ:

inc/config.php

// only accessed in global scope (see init.php) 
$config['error_reporting'] = E_ALL & ~E_NOTICE; 
$config['memory_limit'] = '16M'; 
$config['time_zone'] = 'America/Los_Angeles'; 

// accessed within functions or class methods (see somefile.php) 
define('HTTP', 'http://imac.local/my_site/'); 
define('HTTPS', 'http://imac.local/my_site/'); 
define('FILE_ROOT', '/Library/WebServer/Documents/my_site/'); 

inc/init.php

require 'inc/config.php'; 

/* Set some php configurations */ 
isset($config['error_reporting']) ? error_reporting($config['error_reporting']) : ''; 
isset($config['time_limit']) ? set_time_limit($config['time_limit']) : ''; 
isset($config['memory_limit']) ? ini_set('memory_limit', $config['memory_limit']) : ''; 
isset($config['timezone']) ? date_default_timezone_set($config['timezone']) : date_default_timezone_set('America/Los_Angeles'); 

somefile.php

require 'inc/init.php'; 

function site_url($uri, $secure = FALSE) 
{ 
    return $secure ? HTTPS . $uri : HTTP . $uri; 
} 

Hãy nhớ ví dụ này được lột xuống thể hiện một ý tưởng.

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