Подтвердить что ты не робот

Разрушители Php

Пожалуйста, дайте мне примеры реальной жизни, когда вам приходилось использовать __destruct в своих классах.

4b9b3361

Ответ 1

Хорошо, так как мой последний ответ, по-видимому, не попал в цель, позвольте мне попробовать это снова. В этой теме есть много ресурсов и примеров в Интернете. Выполняя немного поиска и просмотра другого кода рамки, и вы увидите несколько хороших примеров...

Не забывайте, что только потому, что PHP будет закрывать ресурсы при завершении, вы не имеете в виду, что это плохо, чтобы явно закрыть их, когда вы больше не нуждаетесь в них (или хорошо их не закрывать)... Это зависит от того, (используется ли он до конца, или есть один вызов на раннем этапе, а затем не нужен снова для остальной части исполнения)...

Теперь мы знаем, что __destruct вызывается, когда объект уничтожается. Логически, что произойдет, если объект будет уничтожен? Ну, это означает, что он больше не доступен. Итак, если у него открыты ресурсы, не имеет смысла закрывать эти ресурсы, поскольку они уничтожаются? Конечно, на средней веб-странице страница скоро закончится, поэтому закрытие PHP обычно не страшно. Однако что произойдет, если по какой-то причине script работает долго? Тогда у вас есть утечка ресурсов. Итак, почему бы не просто закрыть все, когда вам это больше не нужно (или учитывая объем деструктора, когда он больше не доступен)?

Вот несколько примеров в реальных фреймах:

Интересно, что Kohana отслеживает теги, чтобы позже удалять их через "пространство имен" (а не просто очищать кеш). Поэтому он использует деструктор, чтобы скрыть эти изменения в жестком хранилище.

Класс CodeIgniter также делает что-то интересное, поскольку он добавляет вывод отладки в выходной поток в деструкторе. Я не говорю, что это хорошо, но это пример еще одного использования...

Я лично использую деструкторы, когда у меня есть длительные процессы на моем главном контроллере. В конструкторе я проверяю файл pid. Если этот файл существует (и его процесс все еще запущен), я генерирую исключение. Если нет, я создаю файл с текущим идентификатором процессов. Затем в деструкторе я удаляю этот файл. Так что это больше об очистке после себя, чем просто освобождении ресурсов...

Ответ 2

Существует еще одно удобное использование для создания HTML-страницы

class HTMLgenerator {
  function __construct() {
    echo "<html><body>";
  }
  function __destruct() {
    echo "</body></html>";
  }
}

С помощью этого класса вы можете написать

$html = new HTMLgenerator();
echo "Hello, world!";

И результат

<html><body>Hello, world!</body></html>

Ответ 3

Например:

<?php
class Session
{
    protected $data = array();

    public function __construct()
    {
        // load session data from database or file
    }

    // get and set functions

    public function __destruct()
    {
        // store session data in database or file
    }
};

Это полезно использовать деструкцию. Вы запрещаете чтение и запись на источник сеанса все время и делаете это только в начале и в конце.

Ответ 4

Я создаю страницу php, которая будет генерировать файл jpg информации о фильме. Эта страница должна будет собрать несколько информации и запустить inkscape для преобразования шаблона (файл svg) в png перед преобразованием в jpg. SVG содержит относительные ссылки на другое изображение, которое должно быть файлом. Поэтому моя страница загружает необходимые файлы во временную папку, конвертирует SVG файл. В конце временная папка должна быть удалена.

Я помещаю временную папку в деструктор. Прежде чем может быть много причин, страница неожиданно неожиданна, и единственное, что я могу быть уверен, это то, что деструктор будет вызываться при выходе страницы.

Надеюсь, что это поможет.

Ответ 5

Деструктор чрезвычайно полезен, если вы используете специальный соединитель/оболочку базы данных.

В конструкторе вы можете передать информацию о соединении. Поскольку вы можете использовать деструктор (а не финализатор и т.д.), Вы можете положиться на это, чтобы закрыть соединение для вас. Это более удобно, но это, безусловно, полезно.

Например, когда PHP решает явно "освободить" объект (т.е. он больше не используется), он вызовет деструктор в это время. Это более полезно в описываемом сценарии, поскольку вы не ожидаете запуска сборщика мусора и вызываете финализатор.

$0.02

Ян

Ответ 6

<?php
class Database
{
    private $connection;
    private $cache = array();

    function __construct([$params])
    {
        //Connection here
    }

    //Query
    public function query(Query $Query)
    {
        if($this->is_cached($Query->checksum))
        {
            return $this->get_cache($Query->checksum);
        }
        //...
    }
    public function __destruct()
    {
        unset($this->connection);
        $this->WriteCache();
        unset($this->cache);
        shutdown_log($this,'Destruction Completed');
    }
}
?>

Вот пример, который должен вас понять.

Ответ 7

Если вы используете дескрипторы, возвращаемые fopen(), например, протоколирование, вы можете использовать __destruct(), чтобы удостовериться, что fclose() вызывается в наших ресурсах, когда ваш класс уничтожен.

Ответ 8

Вы правы, __destruct в большинстве случаев не нужен для коротких сценариев php. Соединения с базами данных, дескрипторы файлов и т.д. Закрываются на script, или иногда даже раньше, если переменные заканчиваются.

Один пример, который я могу представить, - это записывать журналы в базу данных. Поскольку мы не хотели запускать один запрос на запись в журнале, который создается где-то в script, мы написали часть "write to db" в __destruct класса ведения журнала, поэтому, когда конец script заканчивается, все вставлено в базы данных в одном.

Другой пример: если вы разрешаете пользователю загружать файлы, деструктор иногда является хорошим местом для удаления временного файла (в случае, если что-то пойдет не так в script, по крайней мере, оно будет очищено)

Но даже для дескрипторов файлов это может быть полезно. Я работал над приложением, которое использовало старые вызовы fopen и т.д., Обернутые в объекты, и при использовании файлов на больших файловых файлах php рано или поздно закончит работу с файловыми дескрипторами, поэтому очистка при запуске script была не только приятной но необходимо.

Ответ 9

Я использую кеширование APC для большого количества объектов с низким уровнем, которые в противном случае использовали бы чрезмерную память; и у меня есть объект cacheCollection, который обрабатывает чтение и запись этих объектов "низкого уровня" в APC и из APC во время выполнения script. Когда script завершается, объекты должны быть очищены от APC, поэтому я использую метод cacheCollection __destruct для выполнения этой функции.

Ответ 10

Я использовал __destruct() в классе журнала, который завернул соединение с базой данных:

<?php

class anyWrap
{
  private $obj,$calls,$log,$hooks;
  function anyWrap($obj, $logfile = NULL)
  {
       if(is_null($logfile))
       {
         $this->log = dirname(__FILE__) . "/../logs/wrapLog.txt";
       }
       $this->hooks = array();
       $this->dbCalls = 0;
       $this->obj = $obj;
  }

   public function __set($attri, $val) {
       $this->obj->$attri = $val;
   }

   public function __get($attri) {      
       return $this->obj->$attri;
   }
  public function __hook($method)
  {
   $this->hooks[] = $method;
  }


   public function __call($name,$args)
   {
       $this->calls++;
       if(in_array($name,$this->hooks))
       {
           file_put_contents($this->log,var_export($args,TRUE)."\r\n",FILE_APPEND);
       }
       return call_user_func_array(array($this->obj,$name),$args);
   }
   //On destruction log diagnostics
   public function __destruct()
   {
        unset($this->dbReal);
        file_put_contents($this->log,$this->calls."\r\n",FILE_APPEND);
   }
}

script перехватывает вызовы базы данных и записывает в них команды подготовки, а затем, когда script закончил (я не всегда знаю, когда), он, наконец, зарегистрирует количество вызовов в базе данных файл. Таким образом, я вижу, сколько раз определенные функции вызывались в базе данных и соответственно планировали мою оптимизацию.

Ответ 11

Если вы создаете представление с помощью PHP script в базе данных MySQL, вы должны удалить, который будет отображаться в конце script. Потому что если нет, то в следующий раз, когда выполняется script, представление не будет создано, так как в базе данных уже есть аналогичное имя. Для этого вы можете использовать деструктор.