Какой "правильный способ" использовать деструкторы в PHP


При просмотре ссылок хороших занятий PHP для управления памятью я наткнулся на несколько intendimentos, как использовать деструкторы.

я Знаю, что главный актер-это Garbage Collector плохие-это не часть области, что на мой вопрос.

Фильмография:

, Плохие мои показания мне приносят вопросы которые не нашел ответов, сами будучи...

Вопросы:

  • функции __destruct(){} пустой будет удалить любое значение, связанное с класса, или нужно явно указать эти значения в вашей области?
  • После создания экземпляра класса за привлечение и до завершения работы сценария, в чем разница между использованием NULL и unset() по пример:

    <?php
        $refer = new MyClass();
        $refer->hello(); // output: Hello World!
    
        $refer = NULL; // ou unset($refer);
    
        // mais blocos de código aqui...
    
  • По Руководстве PHP наследования clase требует, чтобы класс "дочь" explicite называются parent::__destruct() в деструкторе... плохие и в случае, если классы не расширены, instanciam другого класса в своей области? При назначении NULL или использовать unset() до закрытия сценарий forcará обоих деструкторы или нужно пояснить? Пример:

    <?php
        /**
        class Core
        {
             public function __construct(){}
    
             public function session($start=true)
             {
                 if ( !$start  ) {
                      if ( isset($_SESSION) ) {
                           session_destroy();
                           return true;
                      }
                 }
                 session_start();
             }
    
             public function language()
             {
                 if ( isset($_SESSION) ) {
                      $_SESSION['language'] = 'pt-BR';
                 }
             }
    
             public function layoutEngine()
             {
                 return new HandlerUI(); // outra classe
             }
    
             function __destruct(){
                 #
             }
        }
    
        class HandlerUI
        {
             function __construct()
             {
                 return $this;
             }
    
             public function Header()
             {
                 return "<head><title>Hello World</title></head>";
             }
    
             public function NavBar()
             {
                 return "<nav>This is navbar</nav>";
             }
    
             public function Drawer()
             {
                 return "<div class='drawer-container'></div>";
             }
    
             public function Footer()
             {
                 return "<footer>I am Footer</footer?";
             }
    
             public function JavaScript()
             {
                 return "<script type='text/javascript'>console.log('hola que tal');</script>";
             }
    
             function __destruct(){
                 #
             }
        }
        */
    
        // caso de uso:
        $app = new Core()
    
        $app->session();
        $app->language();
    
        $layout = $app->layoutEngine();
    
        unset($app); // ou $app = NULL;
    ?>
    <!DOCTYPE html>
    <html lang="<?php echo $_SESSION['language'];?>">
    <?php
        $layout->Header();
    ?>
    <body id="body">
        <!-- CONTAINER -->
        <section class="default">
            <?php
                // navbar
                $layout->Navbar();
                // drawer
                $layout->Drawer();
            ?>
    
            <!-- CENTRAL BLOCK -->
            <section id="central-block"></section>
            <?php
                //
                $layout->Footer();
            ?>
        </section>
        <?php
            //
            $layout->JavaScript();
    
            unset($layout); // ou $layout = NULL;
    
            // mais blocos de código aqui...
        ?>
    </body>
    </html>
    
  • и больше я подвергаю сомнению: при использовании OPcache или другого кэш код (что сохраняется в памяти компиляции), как рассматривается в fução __destruct() в этом случае, если использование кэш-памяти?

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

, Так как вы уже благодарен.

Author: Comunidade, 2017-03-08

1 answers

Метод __destruct служит для того, чтобы выполнить последнее действие, прежде чем объект больше не существует.

Пользой, что может быть сделано с ним, если вы строите framework, положить на Контроллер универсального применения каналы с тем же именем, Контроллер в конце запуска. Когда другие controllers extenderem контроллер универсальный все они будут иметь эту функциональность вызова каналы надлежащего автоматически в конце выполнения.

Пример кода с помощью __construct и __destruct :

<?php

class Teste
{
    private $nome;

    function __construct($nome)
    {
        echo 'O objeto foi construído.<br>';
        $this->nome = $nome;
    }

    function saudacao()
    {
        return 'Olá ' . $this->nome . '! <br>'; 
    }

    function __destruct()
    {
        echo 'O objeto não existirá mais após essa mensagem.';
    }   

}


$teste = new Teste('Lauro');

echo $teste->saudacao();


?>

Output, созданный при запуске скрипта:

O objeto foi construído.
Olá Lauro!
O objeto não existirá mais após essa mensagem.

Примечание: PHP очищает все переменные из памяти в конце выполнения скрипта. Итак, в конце сценария, при удалении объекта он запускает destruct автоматически. Но если объект был уничтожен при отключенном в destruct было бы с таким же именем, только то, что до окончания выполнения скрипта в целом.

Нет необходимости объявить __construct или __destruct, если не использовать их.

 2
Author: Antonio Alexandre, 2017-03-08 10:16:25