$ settings или Config Class для сохранения настроек проекта?

Как сохранить настройки для проекта?

Что лучше – использовать массив $settings со всеми моими настройками:

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

или создать Config класс Config со всеми настройками в нем?

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

Какие-нибудь хорошие примеры?

Я думаю, что лучше всего использовать константы для конфигурации. Например, используя константы класса:

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

Если у вас есть PHP 5.3, вы также можете определить их как глобальные константы:

 const MAX_PHOTOS = 30; echo MAX_PHOTOS; 

Но я думаю, что это гораздо менее чисто и прямолинейно.

Очевидно, что это будет работать только до тех пор, пока вы только сохраняете константы, то есть скалярные значения без выражения. Если ваша конфигурация содержит массивы, например, это больше не будет работать. В этом случае я бы использовал класс Config с общедоступными статическими свойствами:

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

Последнее очень похоже на подход $config array array, но имеет преимущество (или может быть, это недостаток?), Что класс доступен извне, включая функции и классы, тогда как массив доступен только в глобальном пространстве, если вы не импортируете он в функции / классы с использованием global $config; ,

Либо будет работать хорошо, независимо от того, что вам больше всего нравится.

Лучший способ – сохранить настройки в файле. и для управления этим файлом объявить класс, который выполняет операции с файлом

Если вы идете на подход массива, вы можете использовать литералы массивов для немного более читаемого кода:

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

Мои два цента: используйте оба. Большинство параметров конфигурации приложения относятся к глобальной переменной массива. Данные конфигурации должны быть доступны из разных частей приложения, и для этого нужны глобальные переменные. И держать все вместе в массиве наиболее разумно. Массив может быть расширен, например, некоторые параметры, заданные в файле config.php, а остальные – из config.ini, например.

Но есть место для КОНСТАНТОВ. Тонкая линия для рисования – если опция действительно является чем-то, что МОЖЕТ меняться во время выполнения приложения, или если оно больше фиксированного / магического значения. Если после настройки вы не должны изменять настройки приложения (или может произойти сбой рендеринга), тогда эта опция не должна находиться в массиве, но по размеру фиксирована как постоянная. (Это интерпретирующее правило, но хорошо послужило мне.)

Если настройки проекта слишком тяжелые, то файл (xml лучше) хорош, и специальный класс для настроек также хорош.

Если настройки проекта невелики, тогда массив лучше, очень быстро и не будет возникать проблема, связанная с вводом-выводом.

Даже вы можете использовать базу данных (более медленную и автономную).

Я склонен указывать значения конфигурации, которые доступны только глобально в массиве config, и определять значения, которые доступны в любом месте. Например:

вкл / 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/'); 

вкл / 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; } 

Имейте в виду, что этот пример лишен возможности продемонстрировать идею.