"PHP" / Говнокод #4668 Ссылка на оригинал

0

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

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

Запостил: dwinner dwinner, (Updated )

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

    • Можно и 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 программисты так делают
        Ответить
        • Ну вообще-то нет, специально проверил, что вторая ссылка на объект всё ещё актуальна, и что get_object_vars() не делает то, что ожидал говнокодер, т.е. вызов лишний, и такой деструктор не нужен, что собственно и требовалось доказать!
          Ответить
  • у меня такое подозрение, что автор, сделав ссылку в строчке
    $props =& get_object_vars($this);
    а потом сразу
    $props = array();
    наивно полагает, что... уничтожит все переменные класса. гы )
    Ответить

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

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8