Примечание: это справочный вопрос для работы с переменной областью в PHP. Пожалуйста, закройте любой из множества вопросов, подходящих к этому шаблону, как дубликат этого.
Что такое «переменная область» в PHP? Доступны ли переменные из одного файла .php в другом? Почему я иногда получаю ошибки «неопределенная переменная» ?
Ответы:
Что такое «переменная область»?
Переменные имеют ограниченную «область видимости» или «места, из которых они доступны». То, что вы
$foo = 'bar';
однажды написали где-то в своем приложении, не означает, что вы можете ссылаться$foo
из любого другого места внутри приложения. Переменная$foo
имеет определенную область, в которой она действительна, и только код в той же области имеет доступ к переменной.Как определяется область действия в PHP?
Очень просто: PHP имеет область действия функции . Это единственный вид разделителя области видимости, который существует в PHP. Переменные внутри функции доступны только внутри этой функции. Переменные вне функций доступны везде вне функций, но не внутри какой-либо функции. Это означает, что в PHP есть одна специальная область: глобальная область. Любая переменная, объявленная вне какой-либо функции, находится в этой глобальной области видимости.
Пример:
$foo
находится в глобальной области видимости,$baz
находится в локальной области видимости изнутриmyFunc
. Только код внутриmyFunc
имеет доступ к$baz
. Только код снаружиmyFunc
имеет доступ к$foo
. Ни один из них не имеет доступа к другому:Область и включенные файлы
Границы файла не разделяют область видимости:
a.php
b.php
К
include
d-коду применяются те же правила, что и к любому другому коду: толькоfunction
отдельная область. Для целей охвата вы можете подумать о включении таких файлов, как копирование и вставка кода:c.php
В приведенном выше примере,
a.php
был включен внутриmyFunc
, любые переменные внутриa.php
имеют только локальную область видимости функции. Просто потому , что они появляются , чтобы быть в глобальном масштабе вa.php
вовсе не обязательно означает , что они, на самом деле зависит от того, какой контекст , что код включен / выполняется в.Как насчет функций внутри функций и классов?
Каждая новая
function
декларация вводит новую область, это так просто.(анонимные) функции внутри функций
классы
Для чего нужна сфера?
Решение проблем с областями видимости может показаться раздражающим, но ограниченная область применения переменных необходима для написания сложных приложений! Если бы каждая объявленная вами переменная была бы доступна из любого места внутри вашего приложения, вы бы пошагово перебирали все переменные, не имея реального способа отследить, что и что изменится. Существует только так много разумных имен, которые вы можете дать своим переменным, вы, вероятно, захотите использовать переменную "
$name
" более чем в одном месте. Если бы вы могли иметь это уникальное имя переменной только один раз в своем приложении, вам пришлось бы прибегнуть к действительно сложным схемам именования, чтобы убедиться, что ваши переменные уникальны и что вы не меняете неправильную переменную из неправильного фрагмента кода.Заметим:
Если бы не было области видимости, что бы делала вышеуказанная функция? Откуда
$bar
берутся? В каком состоянии он находится? Это даже инициализировано? Вы должны проверять каждый раз? Это не подлежит ремонту. Что приводит нас к ...Пересечение границ границ
Правильный путь: передача переменных в и из
Переменная
$bar
явно входит в эту область в качестве аргумента функции. Глядя на эту функцию, становится ясно, откуда берутся значения, с которыми она работает. Затем он явно возвращает значение. Вызывающая сторона уверена, что знает, с какими переменными будет работать функция и откуда возвращаются ее значения:Расширение области видимости переменных в анонимные функции
Анонимная функция явно включает в себя
$foo
из окружающей ее области видимости. Обратите внимание, что это не то же самое, что глобальный область.Неправильный путь:
global
Как было сказано ранее, глобальная область видимости является чем-то особенным, и функции могут явно импортировать переменные из нее:
Эта функция использует и изменяет глобальную переменную
$foo
. Не делай этого! (Если только вы действительно действительно действительно не знаете, что делаете, и даже тогда: не надо!)Все, что вызывает эта функция, видит так:
Там нет никаких признаков того, что эта функция имеет какие-либо побочные эффекты , но это так. Это очень легко становится запутанным беспорядком, поскольку некоторые функции продолжают изменяться и требуют некоторого глобального состояния. Вы хотите, чтобы функции были без состояния , действовали только на свои входы и возвращали определенный вывод, сколько бы раз вы их ни вызывали.
Вы должны избегать использования глобальной области видимости в максимально возможной степени; Скорее всего, вы не должны «вытягивать» переменные из глобальной области в локальную область.
источник
global
, поэтому, пожалуйста, сообщите нам, когда мы должны использоватьglobal
? И, пожалуйста, объясните (немного), чтоstatic
..?global
. Это всегда неправильно. Передача параметров функции правильная.static
хорошо объяснено в руководстве и не имеет большого отношения к области применения. В двух словах, это можно рассматривать как «глобальную переменную в области видимости». Я расширяю его использование здесь kunststube.net/static .include_once
и, возможно,require_once
также должен быть где-то добавлен; просто говорю. ОП проголосовал, чтобы вновь открыть их вопрос. Будет ли их пост особым случаем и что с этим делать?Хотя переменные, определенные внутри области действия функции, не могут быть доступны извне, это не означает, что вы не можете использовать их значения после завершения этой функции. В PHP есть хорошо известное
static
ключевое слово, которое широко используется в объектно-ориентированном PHP для определения статических методов и свойств, но следует помнить, что оноstatic
также может использоваться внутри функций для определения статических переменных.Что такое «статическая переменная»?
Статическая переменная отличается от обычной переменной, определенной в области действия функции, в том случае, если она не теряет значение, когда выполнение программы выходит из этой области. Давайте рассмотрим следующий пример использования статических переменных:
Результат:
Если бы мы определили
$counter
без этого,static
то каждый раз отображаемое значение будет таким же, как$num
параметр, передаваемый в функцию. Использованиеstatic
позволяет построить этот простой счетчик без дополнительных обходных путей.Примеры использования статических переменных
Ухищрения
Статическая переменная существует только в локальной области действия функции. К нему нельзя получить доступ за пределами функции, в которой он был определен. Поэтому вы можете быть уверены, что оно сохранит свое значение без изменений до следующего вызова этой функции.
Статическая переменная может быть определена только как скаляр или скалярное выражение (начиная с PHP 5.6). Присвоение ему других значений неизбежно ведет к провалу, по крайней мере, на момент написания этой статьи. Тем не менее, вы можете сделать это только на следующей строке вашего кода:
Результат:
Статическая функция является своего рода «общей» для методов объектов одного и того же класса. Это легко понять, просмотрев следующий пример:
Это работает только с объектами одного класса. Если объекты принадлежат разным классам (даже расширяют друг друга), поведение статических переменных будет таким, как ожидалось.
Является ли статическая переменная единственным способом сохранить значения между вызовами функции?
Другой способ сохранить значения между вызовами функций - использовать замыкания. Замыкания были введены в PHP 5.3. В двух словах они позволяют вам ограничить доступ к некоторому набору переменных в области действия функции другой анонимной функции, которая будет единственным способом доступа к ним. Находящиеся в замыкании переменные могут имитировать (более или менее успешно) такие концепции ООП, как «константы класса» (если они были переданы в замыкании по значению) или «частные свойства» (если они передаются по ссылке) в структурном программировании.
Последнее фактически позволяет использовать замыкания вместо статических переменных. Что использовать, решать только разработчикам, но следует отметить, что статические переменные, безусловно, полезны при работе с рекурсиями и заслуживают того, чтобы их заметили разработчики.
источник
Я не буду публиковать полный ответ на вопрос, поскольку существующие и руководство по PHP делают большую часть объяснения большей части этого.
Но один вопрос , который был пропущен, что из суперглобальных , в том числе широко используются
$_POST
,$_GET
,$_SESSION
и т.д. Эти переменные являются массивы, которые доступны всегда, в любой области, безglobal
декларации.Например, эта функция выведет имя пользователя, выполняющего скрипт PHP. Переменная доступна для функции без каких-либо проблем.
Общее правило «глобальные ошибки плохие», как правило, изменяется в PHP на «глобальные ошибки плохие, но суперглобальные в порядке», если не злоупотреблять ими. (Все эти переменные доступны для записи, поэтому их можно использовать, чтобы избежать внедрения зависимостей, если вы действительно ужасны.)
Эти переменные не обязательно присутствуют; администратор может отключить некоторые или все из них, используя
variables_order
директиву inphp.ini
, но это не обычное поведение.Список текущих суперглобалей:
$GLOBALS
- Все глобальные переменные в текущем скрипте$_SERVER
- Информация о сервере и среде исполнения$_GET
- значения, передаваемые в строке запроса URL, независимо от метода HTTP, используемого для запроса$_POST
- Значения, передаваемые в запросе HTTP POST с типами MIMEapplication/x-www-form-urlencoded
илиmultipart/form-data
MIME$_FILES
- Файлы, переданные в HTTP-запросе POST сmultipart/form-data
типом MIME$_COOKIE
- куки переданы с текущим запросом$_SESSION
- переменные сессии хранятся внутри PHP$_REQUEST
- Как правило, комбинация$_GET
и$_POST
, но иногда$_COOKIES
. Содержание определяетсяrequest_order
директивой вphp.ini
.$_ENV
- Переменные окружения текущего скриптаисточник