Глобальные переменные в PHP считаются плохой практикой? Если да, то почему?
function foo () {
global $var;
// rest of code
}
в моих небольших PHP-проектах я обычно иду процедурным путем. У меня обычно есть переменная, которая содержит конфигурацию системы, и когда я nead для доступа к этой переменной в функции, я делаю global $var;
.
это плохая практика?
6 ответов:
действительно глобальный в PHP. Область применения типовой программы PHP-это один запрос HTTP. Переменные сеанса на самом деле имеют более широкую область действия, чем "глобальные" переменные PHP, потому что они обычно охватывают много HTTP-запросов.
часто (всегда?) вы можете вызывать функции-члены в таких методах, как
preg_replace_callback()
как это:preg_replace_callback('!pattern!', array($obj, 'method'), $str);
посмотреть обратные вызовы дополнительные.
дело в том, что объекты были прикреплены к PHP и в некотором роде приводят к некоторой неловкости.
не слишком заботьтесь о применении стандартов или конструкций из разных языков к PHP. Еще одна распространенная ловушка-попытка превратить PHP в чистый язык ООП, вставляя объектные модели поверх всего.
Как и все остальное, используйте" глобальные " переменные, процедурные код, определенная структура и ООП, потому что это имеет смысл, решает проблему, уменьшает объем кода, который вам нужно написать, или делает его более доступным и понятным, а не потому, что вы думаете, что должны.
глобальные переменные, если они не используются тщательно, могут затруднить поиск проблем. Предположим, вы запрашиваете PHP-скрипт, и вы получаете предупреждение о том, что пытаетесь получить доступ к индексу массива, который не существует в какой-либо функции.
Если массив, к которому вы пытаетесь получить доступ, является локальным для функции, вы проверяете функцию, чтобы увидеть, не допустили ли вы ошибку. Это может быть проблема с входом в функцию, поэтому вы проверяете места, где функция вызывается.
но если массив глобальный, нужно проверить все места, где вы используете глобальную переменную, и не только это, вы должны выяснить, в каком порядке эти ссылки на глобальную переменную доступны.
Если у вас есть глобальная переменная в куске кода, это затрудняет выделение функциональности этого кода. Почему вы хотите изолировать функциональность? Таким образом, вы можете проверить его и использовать его в другом месте. Если у вас есть какой-то код вам не нужно тестировать и не нужно будет повторно использовать, то с помощью глобальных переменных это нормально.
Я согласен с клитус. я бы добавил две вещи:
- используйте префикс, чтобы сразу определить его как глобальный (например, $g_)
- объявите их в одном месте, не идут брызгать их все вокруг кода.
с наилучшими пожеланиями, Дон
кто может спорить против опыта, степени колледжа и разработки программного обеспечения? Не я. Я бы только сказал, что при разработке объектно-ориентированных одностраничных PHP-приложений мне больше нравится, когда я знаю, что могу построить все с нуля, не беспокоясь о столкновениях пространств имен. Строительство с нуля-это то, что многие люди не делать. У них есть работа, крайний срок, бонус или репутация, о которой нужно заботиться. Эти типы, как правило, используют так много встроенного кода с высокими ставками, что они вообще не могут рисковать, используя глобальные переменные.
Это может быть плохо использовать глобальные переменные, даже если они используются только в глобальной области программы, но давайте не забывать о тех, кто просто хочет получайте удовольствие и сделать что-то.
Если это означает использование нескольких переменных (
вообще, я бы не сказал, что использование глобальных переменных плохая практика. Я бы сказал, что использование глобальных переменных (флагов и т. д.) вне глобальной области программы-это нарываться на неприятности и (в конечном счете) опрометчивым потому что вы можете потерять след их состояние довольно легко. Кроме того, я бы сказал, что чем больше вы узнаете, тем меньше вы будете полагаться на глобальных переменных, потому что вы испытали "радость" отслеживания ошибок, связанных с их использованием. Это само по себе будет стимулировать вас найти другой способ решить ту же проблему. По совпадению, это имеет тенденцию подталкивать людей PHP в направлении обучения использованию пространств имен и классов (статические члены и т. д...).
область компьютерных наук является обширный. Если мы отпугиваем всех от чего-то, потому что мы называем это плохо, затем они теряют удовольствие от истинного понимания мотивов метки.
используйте глобальные переменные, если необходимо, но затем посмотрите, сможете ли вы решить проблему без них. Коллизии, тестирование и отладка значат больше, когда вы глубоко понимаете истинную природу проблемы, а не только описание проблемы.
как:
global $my_global; $my_global = 'Transport me between functions'; Equals $GLOBALS['my_global']
это плохая практика (как Wordpress
$pagenow
)... хмммConcider this:
$my-global = 'Transport me between functions';
это ошибка PHP но:
$GLOBALS['my-global'] = 'Transport me between functions';
и не ошибка hypens не будет конфликтовать С" общими " переменными, объявленными пользователем, например
$pagenow
. И использование верхнего регистра указывает на суперглобальный в использовании, легко обнаружить в коде или отслеживать с найти в файлахЯ использую дефисы, если им лень строить классы всего для одного решения, например:
$GLOBALS['PREFIX-MY-GLOBAL'] = 'Transport me ... ';
но в случаях более широкого использования, я использую один глобальные переменные в массив:
$GLOBALS['PREFIX-MY-GLOBAL']['context-something'] = 'Transport me ... '; $GLOBALS['PREFIX-MY-GLOBAL']['context-something-else']['numbers'][] = 'Transport me ... ';
последнее для меня,хорошая практика на" cola light "цели или использовать, вместо того, чтобы загромождать с одноэлементными классами каждый раз, чтобы" кэшировать " некоторые данные. Пожалуйста, сделайте комментарий, если я ошибаюсь или пропустил что-то глупое здесь...
репост из законченной так документации бета
мы можем проиллюстрировать эту проблему следующим псевдокодом
function foo() { global $bob; $bob->doSomething(); }
ваш первый вопрос здесь очевиден
откуда
$bob
откуда?вы запутались? Хороший. Вы только что узнали, почему глобалы сбивают с толку и считаются плохой практикой. Если бы это была настоящая программа, ваш следующий бит удовольствия, чтобы пойти отслеживать все экземпляры
$bob
и надеюсь, что вы найдете правильный (это еще хуже, если$bob
используется везде). Хуже, если кто-то другой идет и определяет$bob
(или вы забыли и повторно использовали эту переменную) ваш код может сломаться (в приведенном выше примере кода, имея неправильный объект или вообще не имея объекта, вызовет фатальную ошибку). Так как практически все PHP программы используют код типаinclude('file.php');
ваша работа по поддержанию кода, как это становится экспоненциально сложнее, чем больше файлов вы добавлять.как мы можем избежать их?
лучший способ избежать глобалов-это философия под названием Инъекции Зависимостей. Здесь мы передаем необходимые инструменты в функцию или класс.
function foo(\Bar $bob) { $bob->doSomething(); }
это много легче понять и поддержать. Там нет догадок, где
$bob
был настроен, потому что вызывающий отвечает за знание этого (он передает нам то, что нам нужно знать). Еще лучше, мы можем использовать заявления типа чтобы ограничить то, что передается. Так что мы знаем, что$bob
является либо экземпляромBar
класс, или экземпляр потомкаBar
, то есть, мы знаем, мы можем использовать методы этого класса. В сочетании со стандартным загрузчиком (доступен с PHP 5.3), теперь мы можем отслеживать, гдеBar
определяется. PHP 7.0 или более поздней версии включает расширенные объявления типов, где вы также можете использовать скалярные типы (например,int
илиstring
).