Возможный дубликат:
Являются ли глобальные переменные в PHP плохой практикой? Если да, то почему?
глобальные функции
Изменить: вопрос указан в ссылке выше.
Нет, «global» в php – это не то же самое, что и глобальное на других языках, и, хотя он не создает никаких проблем с безопасностью, он может сделать код менее понятным для других.
OP:
Резюме проекта. Я пишу веб-CMS, чтобы мочить ноги с помощью PHP / MySQL. Чтобы разбить код, у меня есть концепция этих базовых уровней / модулей:
Данные
– Таблицы MySQL
– Переменные PHP
функция
– SQL – Get / Set / etc
– Frontend – Отображение страниц
– Бэкэнд – Менеджер
презентация
– HTML-шаблоны
– Содержание страницы
– Стильные стили CSS
Цель достаточно распространена. Используйте MySQL для хранения настроек сайта и содержимого страницы, используйте php для получения / управления данными контента для обслуживаемой страницы, затем вставляйте в html-шаблон и эхо-браузер. Исходя из языков OO, таких как C #, первая проблема, с которой я столкнулась, – это проблемы с переменной областью при использовании включений и функций.
С самого начала я писал только php-файлы только для функций и включал их там, где это необходимо, в другие файлы, которые имели существующие определения массива переменных. Например, игнорируя уровень данных на один момент, простая страница может выглядеть так:
Файл 1 (страница)
$DATA_PAGE = Array ( 'temp' = null, 'title' = null, [...] ); include 'functions.php'; get_data ( 'page.php' ); [...] run_html ();
Файл 2 (функции)
function get_data ( $page_name ) { global $DATA_PAGE; $DATA_PAGE [ 'temp' ] = 'template'; $DATA_PAGE [ 'title' ] = 'test page'; [...] } function run_html () { global $DATA_PAGE; echo '<html>'; echo '<head>'; echo '<title>' . $DATA_PAGE [ 'title' ] . '</title>'; [...] }
Я выбрал этот метод по нескольким причинам:
Код работает отлично. Но в каждой статье, которую я нахожу по этому вопросу, «глобальные» вызовы в моих функциях называются плохой практикой, хотя в статьях никогда не говорится почему? Я думал, что все это означает «использовать родительскую область». Я предлагаю отверстие для безопасности в моем приложении? Есть ли лучший метод? Заранее спасибо.
Я считаю, что главная причина избежать этого заключается в том, что он скрывает зависимости.
Ваши функции get_data
и run_html
не рекламируют каким-либо образом, что они делят данные, и все же они делают это в большой степени. И нет способа (не run_html
кода) знать, что run_html
будет бесполезным, если get_data
не был вызван.
По мере того как сложность вашей кодовой базы растет, такая скрытая зависимость сделает ваш код хрупким и трудноразрешимым.
Поскольку глобальные переменные могут быть изменены процессом без других частей вашего кода, зная, что он создает неожиданные результаты.
Вы всегда должны стараться, чтобы переменные были скопированы как можно локальнее – это не только поможет вам с отладкой, но и будет держать ваш код проще и чище, чтобы читать, возвращаться и изменять.
Если вы хотите поделиться данными по нескольким функциям, вы можете изучить класс для своих данных и затем определить методы для работы с данными, инкапсулированными в ваш объект. (Объектно-ориентированного программирования)
Плохая практика заключается в том, чтобы использовать переменные из разных областей в свою, потому что это делает ваш код менее портативным. Другими словами, если я хочу использовать get_data()
где-то в другом месте, в другом проекте мне нужно определить переменную $DATA_PAGE
прежде чем я смогу ее использовать.
AFAIK это единственная причина, которой следует избегать – но это довольно веская причина.
Вместо этого я перейду по ссылке.
function get_data (&$data_page, $page_name ) { $data_page['temp'] = 'template'; $data_page['title'] = 'test page'; [...] } get_data($DATA_PAGE);
По многим причинам, например:
Трудно поддерживать код с глобальными переменными. Вы не знаете, где глобальные переменные могут повлиять на вашу логику и не контролировать доступ к ним
Безопасность – если у вас сложная система (особенно с плагинами), кто-то может поставить под угрозу всю систему с глобальными переменными.
Параметры в глобальной переменной прекрасны, но ввод данных, которые могут быть изменены в глобальную переменную, может, как сказал tkone, иметь неожиданные результаты.
Тем не менее, я не согласен с мнением о том, что глобальные переменные следует избегать любой ценой – просто попробуйте обернуть их, скажем, одним типом настроек.