1. PHP / Говнокод #4668

    +164

    1. 1
    2. 2
    3. 3
    4. 4
    public function __destruct () {
      $props =& get_object_vars($this);
      $props = array();
    }

    Двойное уничтожение (если прокатит )))).

    Запостил: dwinner, 17 Ноября 2010

    Комментарии (25) RSS

    • пошто не unset?
      Ответить
      • Можно и unset($props) и $props = null, ну и собственно $props = array(), только вот смысла нет уничтожать переменные, которые и так будут уничтожены!
        Ответить
        • А кто знает, может это не весь код и там дальше идёт что-то секунд на 30.
          Ответить
          • Приведите пожалуйста пример...
            Ответить
            • mysql_connect('zimbabve_dial-up_server');
              mysql_query('SELECT * FROM million_users_table');
              Ответить
              • mysql_query('SELECT * FROM million_users_table')... Чудо оптимизации!
                Какой же следует при таком запросе параметр передать в set_time_limit(),
                если конечно не включен safe_mode вообще???
                Ответить
                • Просили пример долгого запроса и всё.
                  Ответить
                  • Не совсем... Ну да ладно... Всё равно спасибо!
                    Ответить
      • Предположим, что у нас есть в свойствах делегированные объекты. Если мы сделаем просто unset, то мы просто убьём ссылку на объект, но если есть другие ссылки на объект, то объект "выживет". А, если мы заменим значение по ссылке на объект (тут у нас на пустой массив), то делегированные объекты так же будут уничтожены, а ссылки, которые остались от объекта будут просто вести на пустой массив. Т.е. если мы делегируем синглтон, то после такого уничтожения мы больше им воспользоваться не сможем, getInstance будет возвращать пустой массив, а не объект.
        Ответить
      • скажите это автору
        Ответить
    • class User {
      private static $cInst = 0;
      private $_name;
      private $_pass;
      private function __construct($name, $pass) {
      $this->_name = $name;
      $this->_pass = $pass;
      }
      public static function getInstance($name, $pass) {
      if (self::$cInst++)
      throw new Exception('This is a singleton pattern object!');
      else
      return new User($name, $pass);
      }
      public function getName() {
      return $this->_name;
      }
      public function __destruct() {
      $props =& get_object_vars($this);
      $props = array();
      }
      }

      try {
      $user1 = User::getInstance('Den1', 'Winner1');
      $user2 = $user1;
      # Тут деструктор для user1 ???
      echo $user2->getName(); # О чудо! Den1!
      }
      catch(Exception $e) {
      exit($e->getMessage());
      }
      Ответить
    • автор не доверяет php
      Ответить
      • показать все, что скрытоВидимо, он с перла перешел, потому побаивается...
        Ответить
        • скорее всего скопипастил глупость с опеннета. обычно PHP программисты так делают
          Ответить
          • Ну вообще-то нет, специально проверил, что вторая ссылка на объект всё ещё актуальна, и что get_object_vars() не делает то, что ожидал говнокодер, т.е. вызов лишний, и такой деструктор не нужен, что собственно и требовалось доказать!
            Ответить
    • у меня такое подозрение, что автор, сделав ссылку в строчке
      $props =& get_object_vars($this);
      а потом сразу
      $props = array();
      наивно полагает, что... уничтожит все переменные класса. гы )
      Ответить
    • самоубийство не проканало... увы.
      Ответить
    • учим хуйню про "по ссылке" и "по значению"
      Ответить

    Добавить комментарий