Область видимости переменных PHP. Все, что вы хотели знать, но боялись спросить

В данном уроке рассматривается область видимости переменных PHP. Объясняется различие локальной и глобальной области видимости, показывается как получить доступ к глобальным переменным внутри функции, как работать с суперглобалами и создавать статические переменные.

Когда приступаешь к изучению PHP и начинаешь работать с функциями и объектами, область видимости переменных вызывает некоторое смущение. К счастью правила PHP в этом отношении очень просты для понимания (в сравнении с другими языками программирования).

Что такое область видимости?

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

  • Глобальная - к переменным можно получить доступ в любом месте скрипта
  • Локальная - к переменным можно получить доступ только внутри функции, в которой они были определены

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

Переменные с глобальной областью видимости называются глобальными, а с локальной областью видимости - локальными.

Вот пример того, как работают глобальные и локальные переменные.

Привет, Гарри! Значение $globalName: "Зоя" Значение $localName: ""

В данном скрипте мы создали две переменных:

  • $globalName - это глобальная переменная
  • $localName - это локальная переменная, которая создана внутри функции sayHello() .

После создания переменной и функции скрипт вызывает sayHello() ,который выводит "Привет, Гарри!" . Затем скрипт пытается вывести значения двух переменных с помощью функции echo . Вот что происходит:

  • Так как $globalName была создана вне функции, она доступна в любом месте скрипта, поэтому выводится "Зоя" .
  • $localName будет доступна только внутри функции sayHello() . Так как выражение echo находится вне функции, PHP не дает доступа к локальной переменной. Вместо этого, PHP предполагает, что код будет создавать новую переменную с именем $localName , которая получит значение по умолчанию - пустую строку. вот почему второй вызов echo выводит значение "" для переменной $localName .
Доступ к глобальным переменным внутри функции

Для получения доступа к глобальной переменной вне функции достаточно просто написать ее имя. Но для получения доступа к глобальной переменной внутри функции , нужно сначала объявить переменную как глобальную в функции с помощью ключевого слова global:

Function myFunction() { global $globalVariable; // Доступ к глобальной переменной $globalVariable }

Если не сделать этого, то PHP предполагает, что вы создаете или используете локальную переменную.

Вот пример скрипта, который использует глобальную переменную внутри функции:

При выполнении скрипт выведет:

Привет, Гарри! Привет, Зоя!

Функция sayHello() использует ключевое слово global для объявления переменной $globalName как глобальной. После чего она может получить доступ к переменной и вывести ее значение ("Зоя").

Что такое суперглобалы?

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

Вот список суперглобалов, доступных в PHP версии 5.3:

  • $GLOBALS - список всех глобальных переменных в скрипте (исключая суперглобалов)
  • $_GET - содержит список всех полей формы, отправленной браузером с помощью запроса GET
  • $_POST - содержит список всех полей формы отправленной браузером с помощью запроса POST
  • $_COOKIE - содержит список всех куки, отправленных браузером
  • $_REQUEST - содержит все сочетания ключ/значение, которые содержатся в массивах $_GET, $_POST, $_COOKIE
  • $_FILES - содержит список всех файлов, загруженных браузером
  • $_SESSION - позволяет хранить и использовать переменные сессии для текущего браузера
  • $_SERVER - содержит информацию о сервере, такую как, имя файла выполняемого скрипта и IP адрес браузера.
  • $_ENV - содержит список переменных среды, передаваемых PHP, например, CGI переменные.
Например, можно использовать $_GET для того, чтобы получить значения переменных заключенных в строке URL запроса скрипта, и вывести их на странице:

Если вы запустите выше приведенный скрипт с помощью строки URL http://www.example.com/script.php?yourName=Фред, то он выведет:

Привет, Фред!

Предупреждение! В реальном скрипте никогда нельзя использовать подобную передачу данных по причине слабой безопасности. Нужно всегда осуществлять проверку или фильтрацию данных.

Суперглобал $GLOBALS очень удобно использовать, так как он дает возможность организовать доступ к глобальным переменным в функции без необходимости использования ключевого слова global . Например:

Статические переменные: они находятся где-то рядом

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

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

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

Для создания статической переменной в функции нужно использовать ключевое слово static перед именем переменной и обязательно задать ей начальное значение. Например:

Function myFunction() { static $myVariable = 0; }

Рассмотрим ситуацию, когда удобно использовать статическую переменную. Допустим, вы создаете функцию, которая при вызове создает виджет и выводит количество уже созданных виджетов. Можно попробовать написать такой код с использованием локальной переменной:

Но, так как переменная $numWidgets создается каждый раз при вызове функции, то мы получим следующий результат:

Создаем некие виджеты... 1 мы уже создали. 1 мы уже создали. 1 мы уже создали.

Но с использованием статической переменной, мы сможем сохранять значение от одного вызова функции к другому:

Теперь скрипт выдаст ожидаемый результат:

Создаем некие виджеты... 1 мы уже создали. 2 мы уже создали. 3 мы уже создали.

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

Вот и все! Почаще обращайтесь к документации по PHP.

В продолжение ранее заданного вопроса с новыми подробностями.Итак:Сайт в облаке, тема - Дефолт 3.0, can_use_smarty = trueНа подстраницах товара код Smarty вполне себе работает, удается получить доступ и вывести нужные переменные.В описании товара -...

Здравствуйте. В файле checkout.html есть переменая $cart_total = $wa->shop->cart->total() она храни в себе конечную стоимость. А как разбить эту стоимость на стоимость доставки и стоимость заказа и все это вывести на сайт?Спасибо.

Есть решение

Добрый день.Подскажите, плиз. У меня есть несколько id-шек товаров. К примеру, 1,3,5.Я хочу по ним получить данные из $wa->shop->product()Т.е. мне нужно присвоить переменной данные товаров по этим 3 айдишкам.Как это сделать? Не силен в...

Как-то так (пишу по памяти, надо проверять){$all_my_products = $wa->shop->products()} {foreach $all_my_products as $ab} {$ab|var_dump} {/foreach}

Хочу вывести одновременно 3 цены на витрину Есть решение

Здравствуйте! В ИМ 3 стандартные цены Закупочная, Зачеркнутая и Розничная. Так же у меня при помощи плагина Мультицены созданы ещё 2 дополнительные цены Оптовая, Диллерская. Нужно чтобы все 3 цены отражались на для всех покупателей, но когда клиент...

Вопрос закрыт - ребята уже делают.

Каким запросом можно вывести список доступных переменных Есть решение

Подскажите чем можно пользоваться в разработке кроме {debug} и {wa_dumpc($order)} для просмотра доступных переменных на странице и прочее...Какими конструкциями и запросами можно пользоваться в разработке?

{wa_tpl_vars} - Хелпер, позволяющий вывести все переменные, переданные в текущий шаблон.... этот вопрос уже обсуждался.

Есть решение

Привет, я нечего не понимаю в php, есть только общее понятие, о циклах, массивах и тп. Щарю в css, html, bootstap, uikit, изза того что не понимаю фреймворк, не могу использовать его на полную катушкуЯ не понял как экшены работают, и где их брать(вроде...

Посмотрите описание шаблонизатора Smarty.В шаблоне передаются переменные, которые формируются и отдаются пользователю.Чтобы узнать что содержится в переменной можете её вывести отдельно {$post|wa_print_r}{foreach $post.plugins.before as $plugin => $output} {$output} {/foreach}По этому коду получить массив из переменной $post.plugins.before который содержит в себе ключ($plugin) и значение($output)Вывести все значения {$output} на страницу.

+1 Не принято

Не работают при вставке в Уведомления к заказу, а также в свою печатную форму заказа переменные из Шпаргалки такие...

Доработка темы Дефолт 2.0

Необходимо сделать несколько доработок по дизайну Дефолт 2.0 1. Выровнять высоту картинок товаров в категориях https://yadi.sk/i/JazqloIg3ZQU... 2. Изменить вывод краткого описания, вывести дополнительные поля с иконкам...

Добрый день!Скажите пожалуйста, как вывести характеристики товара в корзине и в каталоге(список товаров), которые выбираются вручную, например размер?1) В корзине уже выбранное значение. Файл стандартного шаблона (product.cart.html).2) В списке товаров...

Просьба помочь мне разобраться. Где найти более полную документацию по движку. А именно мне интересны все переменные smarty, как мне догадаться, с помощью какого кода я должен вывести каталог товаров, корзину, картинку товара, характеристики и т.д. и...

Есть решение

Добрый день. Возникла потребность сделать несколько выпадающих меню.Тема дизайна Дизайн со вкусом PROЗалез в sidebar/nav.html, путем дублирования кода смог получить второе меню, но т.к. оно идентичное, естественно начал его править. Как только я...

Вы можете сделать простое выпадающее меню даже не копируя части кода с привязкой к скриптам темы дизайна, а создать свое меню.Вот скрипт (его вставляете в шаблон темы) $(".open").click(function () {$(this).siblings(".menu").slideToggle(350);}); 350мс - это время появления, а при желании можно добавить ещё разные эффекты. Затем создаете два объекта классов open и menu

error: Content is protected !!