Глобальные переменные в PHP рассмотрены плохой практикой? Если так, почему?

Я соглашаюсь с Jon Skeet на его потоковом примере. Возможно, это не прекрасно, но это имеет преимущество перед большей частью примеров здесь:

Это реалистично

, Велосипеды, люди или животные, формы или оружие просто не были бы смоделированы наследованием в реальных проектах. (формы, в частности, совершенно опасны, потому что это не работает .)

Это - мой главный объект неприязни с наследованием. Это слишком часто преподается как что-то, что должно использоваться для выражения каждый иерархия, которую можно найти. Сотрудник является человеком, правильно? Таким образом, класс Сотрудника должен наследоваться классу Человека. Но человеком является также LivingCreature, таким образом, у нас должен быть один из тех классов также. И LivingCreature является также Организм, таким образом, там у нас есть другой класс. И Организм.... не стесняются продолжаться.

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

Потоки (или устройства как в примере ChrisW) имеют преимущество, которое они делают смысл . Вы хотите смочь рассматривать все потоки то же, подключены ли они к буферу памяти, файлу или сетевому сокету. И все устройства действительно имеют большое поведение вместе, которое могло правдоподобно быть факторизовано в базовый класс Устройства.

84
задан Gordon Gustafson 5 June 2011 в 02:30
поделиться

3 ответа

Когда люди говорят о глобальных переменных на других языках, это означает нечто иное, чем то, что они делают в PHP. Это потому, что переменные не на самом деле глобальные в PHP. Объем типичной программы PHP - один HTTP-запрос. Переменные сеанса на самом деле имеют более широкую область действия, чем «глобальные» переменные PHP, потому что они обычно охватывают множество HTTP-запросов.

Часто (всегда?) Вы можете вызывать функции-члены в таких методах, как preg_replace_callback () следующим образом:

preg_replace_callback('!pattern!', array($obj, 'method'), $str);

См. обратные вызовы для получения дополнительной информации.

Дело в том, что объекты были привязаны к PHP и в некотором смысле приводят к некоторой неловкости.

Не беспокойтесь чрезмерно о применении стандартов или конструкций из разные языки к PHP.

99
ответ дан 24 November 2019 в 08:35
поделиться

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

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

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

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

вы должны выяснить, в каком порядке осуществляется доступ к этим ссылкам на глобальную переменную.

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

вы должны выяснить, в каком порядке осуществляется доступ к этим ссылкам на глобальную переменную.

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

27
ответ дан 24 November 2019 в 08:35
поделиться

Я согласен с Клетусом. я бы добавил две вещи:

  1. использовать префикс, чтобы вы могли сразу идентифицировать его как глобальный (например, $ g _)
  2. объявить их в одном месте, не разбрасывайте их по всему коду.

с наилучшими пожеланиями , дон

16
ответ дан 24 November 2019 в 08:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: