PHP: глобальные переменные альтернативы? - PullRequest
7 голосов
/ 03 августа 2011

Я работаю над проектом PHP, и время от времени между тем, что я читаю онлайн, и тем, что я вижу на форумах и т. Д. Я продолжаю читать, что вы не должны использовать php globals.Убедившись, что я не перепутал это с PHP register_globals, потому что я нет, я занимался исследованиями, но я действительно не нашел, почему или какого-либо другого типа альтернатив.

Итак, мой вопрос прост.Разве я не должен использовать ключевое слово global в PHP?Кроме того, если я не должен (или должен), есть ли альтернативы?Причина в том, что я заметил, что мне нужен доступ к переменной, определенной в другом файле, и мне нужно ссылаться или вызывать эту переменную в функции, множестве функций, и я немного устаю или использую код global $var_name;так много.

Есть идеи (или я просто ошибаюсь)?

Ответы [ 5 ]

3 голосов
/ 03 августа 2011

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

Лучше всего поместить переменные в класс (например, «AppConfig» или болееконкретный класс), и создайте экземпляр этого класса для хранения определенных значений.Затем передайте этот экземпляр всем методам в вашей среде.Таким образом, вы не полагаетесь на конкретную реализацию Singleton и по-настоящему гибки.

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

2 голосов
/ 03 августа 2011

Как уже говорили некоторые другие, нет ничего плохого в использовании глобалов; особенно на коротком скрипте, он может сделать ваш код более читабельным, чем скрывать его слишком большой структурой OO.

Но вы написали: «Мне нужна [эта переменная] много функций, и я немного устаю или использую глобальный $ var_name; так много кода»

Это говорит о том, что вы на самом деле хотите, чтобы все эти функции, использующие $ var_name, были в классе. В качестве первого этапа рефакторинга вы передадите переменную из другого файла в конструктор, замените все ваши ссылки $var_name на $this->var_name, а затем удалите все строки global $var_name;.

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

Если у вас его еще нет, книга Рефакторинга Мартина Фаулера - отличное пособие, которое поможет вам справиться с ситуацией, когда ваш 100-строчный сценарий теперь содержит 1000 строк, и это вас расстраивает. (Примеры в java, но все еще доступны для программиста PHP.)

2 голосов
/ 03 августа 2011

Глобалы плохи, только если вы пишете объектно-ориентированный код. Если ваш код процедурный, глобальные просто в порядке. Если он использует объекты, вам нужно использовать внедрение зависимостей (new Object(new Collaborator)). Чтобы справиться с этим, вам, вероятно, понадобится использовать контейнер для внедрения зависимостей. Если вы начнете использовать статические классы и синглтоны, вы больше не будете писать 100% OO-код.

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

2 голосов
/ 03 августа 2011

Вы не ошибаетесь, вам просто нужно подумать о какой-то архитектуре для вашего приложения.:)

Если у вас есть общие данные между классами, вы должны использовать модель, которая содержит эти общие данные и имеет API, доступный для всех ваших классов, для извлечения этой переменной.вы можете использовать Singleton для хранения общих данных.

На странице PHP Patterns есть пример Singleton.Идея Singleton заключается в том, что вы всегда получаете доступ к одному и тому же экземпляру (версии) этого класса, поэтому, если вы измените переменную там, она будет автоматически изменена в другом месте.

0 голосов
/ 03 августа 2011

В целом, глобальные переменные создают проблемы с безопасностью и ремонтопригодностью кода.Если вы используете современный PHP, то хорошим решением будет иметь статический класс, который может выступать в качестве держателя для всех глобальных переменных, которые вам нужны.Например, хорошим примером является sfConfig из Symfony Framework.Вы можете посмотреть документы и код здесь , чтобы узнать, как создать свой собственный код (или просто очистить код для использования в вашем собственном проекте ... он довольно автономен).

...