Конфигурационный файл PHP: config.php и его варианты

Раздел: Разработка на PHP -> Стандартные файлы проекта

Основы config.php и альтернативные подходы

Как создать базовый конфигурационный файл для хранения настроек?

Конфигурационный файл config.php является неотъемлемой частью любого PHP-проекта. Он централизует параметры подключения к базе данных, настройки приложения, ключи API и другие переменные окружения. Основное решение - простой PHP-файл с использованием констант define() или ассоциативного массива.


<?php
// config.php - базовый вариант с define
define('DB_HOST', 'localhost');
define('DB_NAME', 'my_database');
define('DB_USER', 'root');
define('DB_PASS', 'secret');
define('SITE_URL', 'https://example.com');
define('DEBUG', true);

файл footer php (файл footer.php (подвал сайта))

Подключение в любом файле проекта одной строкой:

require_once __DIR__ . '/config.php';

конфигурационный файл php (конфигурационный файл php (config.php))

Использование: echo DB_HOST;. Такой подход прост и понятен, но имеет недостаток: константы глобальны и их нельзя изменить в рантайме.

Типичная ошибка: повторное объявление константы вызывает фатальную ошибку. Решение - проверять if (!defined('DB_NAME')) { define(...); } или использовать массивы.

Как сделать конфигурацию гибкой и поддерживать разные окружения?

Вместо констант используйте ассоциативный массив. Это позволяет динамически менять настройки, например, в зависимости от среды разработки.


<?php
return [
  'db' => [
    'host' => 'localhost',
    'name' => 'production_db',
    'user' => 'prod_user',
    'pass' => 'prod_pass'
  ],
  'debug' => false,
  'site_url' => 'https://example.com'
];

файл init php (файл init.php (инициализация))

Подключение: $config = require 'config.php';.

Проблема: случайное изменение массива внутри кода. Решение - обернуть массив в объект или использовать константы для критичных параметров.

Как отделить конфиденциальные данные от кода?

Используйте файл .env в формате переменных окружения. Популярна библиотека vlucas/phpdotenv.


# .env
DB_HOST=localhost
DB_NAME=test
DB_USER=root
DB_PASS=secret

файл header php (файл header.php (шапка сайта))


<?php
require_once 'vendor/autoload.php';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();

$host = $_ENV['DB_HOST'];

Ошибка: файл .env может быть случайно закоммичен в репозиторий. Решение - добавить .env в .gitignore, а также использовать .env.example как шаблон.

Как использовать формат JSON или YAML для конфигурации?

Плюс - независимость от PHP. Минус - требуется парсинг. Пример с JSON:


{
  "db": {
    "host": "localhost",
    "name": "json_db"
  },
  "debug": true
}

$config = json_decode(file_get_contents('config.json'), true);

Проблема: ошибки парсинга при некорректном JSON. Решение - выполнять валидацию через json_last_error().

Как сделать конфигурацию объектно-ориентированной?

Создайте класс-конфиг с методами доступа и проверками. Например:


class Config {
  private static $data = [];

  public static function load($file) {
    self::$data = require $file;
  }

  public static function get($key, $default = null) {
    return self::$data[$key] ?? $default;
  }
}

Замечание: синглтон может усложнить тестирование. Решение - внедрение зависимости через контейнер.

Расширенные примеры использования config.php

1. Конфигурация для разных окружений (dev, staging, production)

Пример

// config/env.php
$env = getenv('APP_ENV') ?: 'production';
$config = require __DIR__ . "/config.{$env}.php";
Пример

// config.development.php
return [
  'db' => ['host' => 'localhost', 'name' => 'dev_db'],
  'debug' => true
];
// Вывод в index.php
$config = require 'config/env.php';
echo $config['debug']; // true (если APP_ENV=development)

2. Загрузка из .env с проверкой обязательных полей

Пример

$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
$dotenv->required(['DB_HOST', 'DB_NAME', 'DB_USER']);
// Если переменная отсутствует - выбрасывается RuntimeException

3. Кеширование конфигурации в файл

Пример

$cacheFile = __DIR__ . '/cache/config.php';
if (file_exists($cacheFile)) {
  $config = require $cacheFile;
} else {
  $config = require 'config/raw.php';
  file_put_contents($cacheFile, '<?php return ' . var_export($config, true) . ';');
}

4. Конфигурация с использованием PHP-синтаксиса и вычисляемых значений

Пример

// config/computed.php
$basePath = __DIR__;
return [
  'root' => $basePath,
  'upload_dir' => $basePath . '/uploads',
  'domain' => $_SERVER['HTTP_HOST'] ?? 'localhost',
];
// При подключении:
$config = require 'config/computed.php';
echo $config['upload_dir']; // /var/www/project/uploads

5. Многоуровневый конфиг с наследованием (merge)

Пример

// config/default.php
return [
  'theme' => 'light',
  'locale' => 'en'
];

// config/override.php
return [
  'theme' => 'dark',
  'custom' => true
];

// итоговая загрузка
$default = require 'config/default.php';
$override = require 'config/override.php';
$config = array_merge($default, $override);
// $config = ['theme'=>'dark', 'locale'=>'en', 'custom'=>true]

6. Конфигурация с приватными ключами и маскировкой в логах

Пример

class SecureConfig {
  private $data;
  private $secrets = ['api_key', 'db_pass'];

  public function __construct($file) {
    $this->data = require $file;
  }

  public function get($key) {
    if (in_array($key, $this->secrets) && !empty($this->data[$key])) {
      return substr($this->data[$key], 0, 4) . '****';
    }
    return $this->data[$key] ?? null;
  }
}
$cfg = new SecureConfig('config.php');
echo $cfg->get('api_key'); // 1234****

7. Конфигурация на основе XML или INI

Пример

// config.ini
[database]
host = localhost
name = ini_db

// загрузка
$config = parse_ini_file('config.ini', true);
echo $config['database']['host']; // localhost
// Результат - ассоциативный массив

Конфигурационный файл PHP (config.php) - comments

En
конфигурационный файл php (php)