🐘 Кое-что новое об анонимных функциях PHP

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

class Tester
{
    public function returnFunc()
    {
        return function() {
            return "Function call.\n";
        };
    }

    public function returnStaticFunc()
    {
        return static function() {
            return "Static function call.\n";
        };
    }

    public function __destruct()
    {
        echo "Tester died.\n";
    }
}

$holder = (new Tester)->returnFunc();
gc_collect_cycles();
echo $holder(); // «Function call.»
unset($holder);

$holderStatic = (new Tester)->returnStaticFunc();
gc_collect_cycles(); // дважды «Tester died»
echo $holderStatic(); // «Static function call.»

Обратите внимание на последовательность «return static». Дело в том, что анонимные функции в ПХП, если они создаются в методе, неявно захватывают его контекст, то есть переменную $this. В этом нет никакой беды, если функция короткоживующая.

В моём примере другая ситуация — объект возвращает анонимную функцию, но сам он уже не нужен. Логично было бы предположить, что его при следующей сборке прибъёт сборщик мусора (который я принудительно вызываю функцией gc_collect_cycles), но нет. Ссылка на него содержится в анонимной функции, порождённой методом returnFunc, ПХП интерпретатор и понятия не имеет нужен ли будет внутри контекст объекта, поэтому он его захватывает внутри на всякий случай.

Во втором подпримере конструкция «static function» говорит интерпретатору, что в ссылке на объект мы не нуждаемся, потому вызов gc_collect_cycles убивает два объекта — как предыдущего подпримера (так как переменная $holder уничтожена), так и из текущего, так как такая анонимная функция не содержит ссылку на объект.

2 комментария

🏰 Нижнегородские кирпичи

Два фрагмента кирпича с оттисками клейма, лежащие на серой тканевой поверхности; текст на клеймах частично читаем, но не полностью разборчив.
Кирпичи с клеймом Ивана Афанасьевича Костина, найденные на улице Низенькой

В каком-то необычном изобилии мне стали попадаться кирпичи из Нижнего Новгорода. Кирпич с клеймом Ивана Афанасьевича Костина мне попадался в доме Михляева, в одном из сёл Верхнеуслонского района, на земле в историческом квартале по улице Рахматуллина, а так же под ногами на улице Низенькой.

Старая кирпичная плитка с выгравированным логотипом завода «Красный Октябрь» и номером партии, лежащая среди строительного мусора.
Кирпич Нижегородского Завода Огнеупорных Изделий, найденный на улице Рахматуллина

Другой кирпич — Нижегородского Завода Огнеупорных Изделий с литерой «А» встретился в доме Михляева и в историческом квартале Рахматуллина. Существует вариант того же кирпича с литерой «В». Что значит эта буква неясно — может быть владельца, местность, тип, неизвестно.

Кирпичи обоих производителей — шамотные (огнеупорные), по всей видимости из печек. Почему при солидном обилии местных производителей к нам привозился в таком количестве кирпич из Нижнего Новгорода — тоже неясно. Может у нас его производили мало (или вовсе не производили), может качество было низким или цена высокой.

Оставить комментарий