Межфайловые переменные PHP?

У меня есть куча адресов базы данных и других случайных длинных строк, которые я должен снова и снова вводить в функции по всему моему сайту. Есть ли способ создать в PHP массу постоянных глобальных переменных, которые будут действительны для любого файла в текущей установке PHP?

Или я должен просто создать vars.php со всеми определенными переменными и всегда включать этот файл?


php
person AKor    schedule 03.05.2011    source источник
comment
Вы, вероятно, имеете в виду глобальные константы.   -  person Jared Farrish    schedule 04.05.2011


Ответы (3)


Создайте свой файл с нужными вам настройками. Что-то вроде этого:

<?php
    // My file name might be config.php
    $config = array(
        'db.connection' => 'localhost:3306'
        // etc...
    );
?>

Затем включите его в каждую страницу/файл, который в нем нуждается.

<?php
    require("path-to/config.php");

    // Other stuff this file does/needs
?>
person Kevin Peno    schedule 03.05.2011
comment
я бы использовал require_once(file.php) :) - person mister koz; 04.05.2011
comment
+1, кроме того, что я согласен с мистером Козом, вы должны использовать require_once - person andrewtweber; 04.05.2011
comment
@mister, @andrew: я не require_once, если только я не импортирую класс. Накладные расходы не нужны для этого экземпляра, потому что значения, как и должно быть, являются неизменяемыми значениями конфигурации. Импорт нового ничего не повредит. - person Kevin Peno; 05.05.2011
comment
Если только это не файл констант, классов, функций или чего-то еще, что убивает при многократном объявлении. - person Kevin Peno; 05.05.2011

Ответ: хорошо, оба! Используйте префикс.

http://www.electrictoolbox.com/php-automatically-append-prepend/

person Michael B    schedule 03.05.2011
comment
Если это вообще возможно, было бы лучше обобщить технику в каком-то коде в вашем ответе. - person Jared Farrish; 04.05.2011
comment
Ик, пожалуйста, держитесь подальше от таких настроек INI. Просто используйте require или include для каждого файла, который в этом нуждается. - person Kevin Peno; 04.05.2011
comment
Я не вижу причин держаться подальше от auto_prepend_file. Он часто используется для сеансов или для той цели, о которой просил ОП. Я лично не использую его, но не вижу причин, по которым повторное использование require() или include() является лучшей практикой. Кстати, OP, auto_prepend_file вызывает такие вещи, как require(), а не include(), что означает сбой сценария, если файл не может быть найден. - person Michael B; 04.05.2011
comment
потому что это явно и легко найти/прочитать из кода. Использование настроек INI означает, что в дополнение к коду необходимо будет прочитать/найти конфигурацию сервера. - person Kevin Peno; 04.05.2011

Ну, вы можете использовать переменную $GLOBALS, которая также содержит другие суперглобальные переменные, такие как $_GET, $_POST и т. д. Конечно, это означает, что вы все равно всегда должны включать файл, в котором вы определяете свою собственную пользовательскую переменную.

Хорошая вещь при использовании $GLOBALS заключается в том, что вы можете использовать его во всех областях, и, по крайней мере, имхо, вы можете использовать его как своего рода технику пространства имен.

Например, если вы используете

$settings = array('host' => 'localhost');
    function connect() {
        global $settings;
    }

есть вероятность, что в какой-то момент вы непреднамеренно переопределите переменную $setting. Я думаю, что при использовании $GLOBALS такой сценарий маловероятен.

$GLOBALS['_SETTINGS'] = array(... => ...);
    function connect() {
       $settings = $GLOBALS['_SETTINGS'];
    }

Другим решением будет использование вашего собственного пользовательского класса, в котором вы храните свои настройки в статическом массиве. Опять же, это требует включения файла, в котором вы определяете класс, но ваши данные будут доступны во всех областях и не могут быть случайно переопределены.

Пример:

class MySettings {

    private static $settings = array(
        'host' => 'localhost',
        'user' => 'root'
    );

    public static get($key) {
        return self::$settings[$key];
    }

}

function connect() {
    $host = MySettings::get('host');
    ...
}

Не говорю, что это лучший способ сделать это, но, безусловно, один из способов достижения вашей цели.

person Mikk    schedule 03.05.2011