Почему считается, что плохая практика использует «глобальную» ссылку внутри функций?

Возможный дубликат:
Являются ли глобальные переменные в 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>'; [...] } 

Я выбрал этот метод по нескольким причинам:

  • Данные в этих массивах после sql-выборки могут использоваться в любом месте, включая содержимое страницы
  • Я не хотел иметь дюжину аргументов функции или передавать целые массивы

Код работает отлично. Но в каждой статье, которую я нахожу по этому вопросу, «глобальные» вызовы в моих функциях называются плохой практикой, хотя в статьях никогда не говорится почему? Я думал, что все это означает «использовать родительскую область». Я предлагаю отверстие для безопасности в моем приложении? Есть ли лучший метод? Заранее спасибо.

Я считаю, что главная причина избежать этого заключается в том, что он скрывает зависимости.

Ваши функции 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, иметь неожиданные результаты.

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