🐘 Кое-что новое об анонимных функциях 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 уничтожена), так и из текущего, так как такая анонимная функция не содержит ссылку на объект.
🏰 Нижнегородские кирпичи
Другой кирпич — Нижегородского Завода Огнеупорных Изделий с литерой «А» встретился в доме Михляева и в историческом квартале Рахматуллина. Существует вариант того же кирпича с литерой «В». Что значит эта буква неясно — может быть владельца, местность, тип, неизвестно.
Кирпичи обоих производителей — шамотные (огнеупорные), по всей видимости из печек. Почему при солидном обилии местных производителей к нам привозился в таком количестве кирпич из Нижнего Новгорода — тоже неясно. Может у нас его производили мало (или вовсе не производили), может качество было низким или цена высокой.