Как сохранить настройки для проекта?
Что лучше – использовать массив $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; }
Имейте в виду, что этот пример лишен возможности продемонстрировать идею.