Область видимости
Оригинальное название: scope
Коротко
Часть программы, в которой имя переменной, функции или класса доступно для обращения; за её пределами то же имя либо не видно, либо означает уже другую сущность.
Что такое «Область видимости»
Если бы все переменные программы жили в одном общем пространстве, две функции с переменной $i постоянно мешали бы друг другу. Области видимости разделяют имена: переменная, объявленная внутри функции, существует только там и исчезает после выхода. Правила у языков разные, и именно на них чаще всего спотыкаются при переходе с одного языка на другой.
В PHP функции не видят внешних переменных
В отличие от JavaScript, функция PHP не видит переменных, объявленных снаружи, если их явно не передать:
$city = 'Казань';
function greet() {
return "Привет, $city"; // Warning: Undefined variable $city
}
$greet = function () use ($city) { return "Привет, $city"; };
$greet2 = fn() => "Привет, $city"; // стрелочная захватывает сама
Анонимная функция получает внешние значения через use — так появляется замыкание. Стрелочные функции, начиная с PHP 7.4, захватывают переменные автоматически, но по значению. Глобальную переменную можно подтянуть словом global; в шаблонах WordPress это привычно: global $post, $wpdb;.
Блочная область в JavaScript
В JavaScript старое объявление var видно во всей функции, а let и const из ES6 ограничены блоком в фигурных скобках. Разница проявляется в циклах с отложенным вызовом:
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i)); // 3 3 3
for (let j = 0; j < 3; j++) setTimeout(() => console.log(j)); // 0 1 2
С var все три колбэка видят одну и ту же переменную, которая к моменту вызова уже равна трём. С let на каждом шаге создаётся своя.
Почему глобальные переменные — риск
Всё, что объявлено глобально, доступно любому коду — теме, плагину, чужому скрипту на странице. Две библиотеки, создавшие переменную config, перезапишут друг друга, и ошибка проявится в самом неожиданном месте. Поэтому код заворачивают в функции, классы и модули, а имена группируют в пространства имён. Плагин WordPress, который объявляет функцию get_price() без префикса, рискует столкнуться с другим плагином с тем же именем и уронить сайт фатальной ошибкой.

