Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Блоки и локальные переменные в PHP

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

Рассуждал я как-то — чего же мне не хватает в PHP — языке, которому я посвящаю почти всё своё рабочее время, плюс немного свободного? Помимо всяких мелочей, жизнь без которых не так мила, но, в общем-то, вполне сносна. Не хватает мне вещи, которую я впервые увидел в Perl’e — языке, с такой близкой мне идеологией — который дарит программисту то, что он сам бы никогда не купил.

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

<?php
{
   var $i;
   echo $i = 1;
}
echo $i;

Пояснять нужно? Переменная, объявленная в фигурных скобках, перестаёт существовать за их пределами и не влияет на значения переменной с тем же именем, объявленной уровнем ниже. Я даже согласен на специальную конструкцию (хотя вот эта была бы предельно совместимой), чтобы это включили в PHP6, вместо пространств имён, которые, на мой взгляд, успешно подменяются объектами.

Наверное, нужно пояснить зачем, собственно, это нужно. Поясняю. Для уменьшения расхода памяти, чтобы объект, однажды объявленный в начале файла для локальных нужд, который забыли удалить не тянулся по всему коду, как смрад за народным ополчением, а сразу же, по выходу из блока, попал б в кандидаты на удаление.

Вторая причина — у вас никогда такого не было, что вы перетёрли переменную, которая используется где-то ниже? Например, вы правите чужой код и не в курсе, что переменная в вашей вставке, которой вы дали, на ваш взгляд, уникальное имя $dlja_tmp_2 уже используется и хранит что-то необычайно важное. Используя блок изоляции, можно быть уверенным, что ничего подобного не произойдёт.

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