Область видимости

Оригинальное название: 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() без префикса, рискует столкнуться с другим плагином с тем же именем и уронить сайт фатальной ошибкой.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение