Частично сам себе ответил на вопрос. Согласно здравому смыслу, если объект mysqli_stmt будет уничтожен сборщиком мусора, то mysqli_stmt::close и mysqli_stmt::free_result должны быть вызваны в деструкторе, если в этом есть необходимость (поправьте если ошибаюсь).
Осталось разобраться когда произойдет сборка мусора. Для этого был написан тестовый пример:
<?php
class MyClass
{
public $a;
public function DoWork()
{
$this->a = time(); //на всякий случай чтобы запутать оптимизатор
}
public function __construct()
{
echo('MyClass created<br>');
}
public function __destruct()
{
echo('MyClass destroyed<br>');
}
}
function DoSomething()
{
$tmp = new MyClass();
$tmp->DoWork();
//throw new Exception('Exception');
echo($tmp->a.'<br>'); //на всякий случай чтобы запутать оптимизатор
}
try
{
echo('before DoSomething<br>');
DoSomething();
echo('after DoSomething<br>');
}
catch (Exception $e)
{
echo($e->getMessage().'<br>');
}
?>
Результат выполнения кода:
before DoSomething
MyClass created
1357535133
MyClass destroyed
after DoSomething
Как видно из результата — чистка мусора вызывается при выходе из функции. Если раскомментировать код с исключением, то результат будет:
before DoSomething
MyClass created
MyClass destroyed
Exception
Объект точно так же уничтожен при выходе из функции DoSomething до обработки исключения блоком catch.
Из этого я сделал вывод (опять же не на 100% верный, но наиболее вероятный) что мой объект mysqli_stmt будет уничтожен сразу же как счетчик ссылок на него станет равным нулю, а значит вызов mysqli_stmt::free_result и mysqli_stmt::close скорее всего произойдет в деструкторе.
А вот вопрос, нужно ли вызывать mysqli_stmt::free_result если вызывается mysqli_stmt::close — остается открытым.