Ответы пользователя по тегу PHP
  • когда вызывать mysqli_stmt::close и mysqli_stmt::free_result?

    MrShoor
    @MrShoor Автор вопроса
    Частично сам себе ответил на вопрос. Согласно здравому смыслу, если объект 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 — остается открытым.
    Ответ написан
    Комментировать