Лучшие практики PHP: переделывать переменные из конфигурационного файла при вызове функций или использовать global? - PullRequest
7 голосов
/ 18 сентября 2009

У меня есть программа, которую я использую на нескольких сайтах. Он использует require ('config.php'); установить любые зависимые от сайта переменные, такие как mysql connect информация, пути и т. д.

Допустим, я использую одну из этих зависимых от сайта переменных в функции, например $ backup_path .

Эта переменная была первоначально объявлена ​​в config.php и не отображается в основном файле программы.

Мне нужно получить доступ к этой переменной в функции makebackup ($ table_name); (также в отдельном файле functions.php).

Лучше сказать

makebackup('my_table');

и затем используйте "global $ backup_path" внутри функции, или лучше вызывать функцию с помощью

makebackup('my_table',$backup_path);

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

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

Является ли один или другой из этих методов "стандартным" среди профессиональных программистов? Или я должен использовать $ _ SESSION для объявления этих глобальных переменных?

Ответы [ 7 ]

5 голосов
/ 18 сентября 2009

Второй вариант,

makebackup('my_table', $backup_path);

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

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

1 голос
/ 18 сентября 2009

Альтернативным вариантом является использование констант php с define ().

Ваш config.php установит константы для каждого параметра (соединение mysql, стиль css, wathever). Тогда вам не нужно передавать переменные в функции и не использовать глобальные.

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

1 голос
/ 18 сентября 2009

Обозначьте эту глобальную переменную

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

Итак, я бы переименовал $backup_path в $GLOBAL_backup_path. Каждый раз, когда я видел это, я знал, что нужно быть осторожным с этим.

1 голос
/ 18 сентября 2009

Помните, что вы можете установить значение по умолчанию для вашей функции:

function makebackup($table, $dir = CONFIG_BACKUP_PATH)

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

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

1 голос
/ 18 сентября 2009

Передача ссылок гораздо проще проверить (вы можете задать фиктивные объекты конфигурации). Глобалы меньше так. Вы можете утверждать, что ссылка на метод не равна нулю. Я бы назвал тестирование лучшей практикой.

1 голос
/ 18 сентября 2009

Я думаю, что для этих целей вы должны использовать конфигурацию класса Singleton of Factory.

function makebackup($table)
{
   $backup_path = ConfigFactory().getConfig($some_site_specific_data).getBackupPath()
   mysqldump($table, $backup_path)
}
0 голосов
/ 18 сентября 2009

Не уверен, что действительно есть «правильный» способ сделать это, но другой вариант будет примерно таким:

function makebackup($table, $backup_path = '') {
    if ( $backup_path == '' ) {
        if ( isset($GLOBALS['backup_path']) ) {
            $backup_path = $GLOBALS['backup_path'];
        }
        else {
            die('No backup path provided');
        }
    }
 }

Таким образом, вы можете либо передать значение (для тестирования и использования в будущем), либо, если вы не передадите его, функция будет искать возможную глобальную переменную.

...