За последние 24 часа нас посетил 59091 программист и 1811 роботов. Сейчас ищет 951 программист ...

Как убить все переменные в классе

Тема в разделе "PHP для новичков", создана пользователем artuska, 16 дек 2009.

  1. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Всем привет.
    Вообщем, по сабжу — как сделать вот это:
    Код (Text):
    1. // этот код прямо в классе находится
    2. $vars = get_object_vars($this);
    3.  
    4. foreach($vars AS $key=>$value){
    5.  unset($this->$key);
    6. }
    только подругому? Без цикла, каким-нибудь стандартным методом, котрый возьмет все переменные в классе и убьет их (именно удалит, а не обнулит).
     
  2. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    return new __CLASS__ ? :)
     
  3. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Нет, мне не нужно ничего возвращать.
     
  4. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Бгг. Честно признайся - что куришь?
    Зачем убивать свойства класса, если ты потом этим классом пользоваться не будешь?

    PHP:
    1. <?php
    2. $obj = new sampleclass();
    3. unset($obj);
     
  5. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Я буду пользоваться этим классом, только при каждом вызове класса там будут каждый раз другие переменные.

    Дело такое — есть класс в который подается массив с ключами-значениями, например, настройки класса и т.п.
    Дальше, я беру этот массив и:
    Код (Text):
    1. foreach($array AS $key=>$value){
    2.  $this->$key = $value;
    3. }
    И в результате у меня в классе доступны некоторые переменные.
    Но! Перед тем, как эти переменные создать, мне нужно удалить старые переменные, которые есть в этом классе (а они там есть, не спрашивайте почему, долго объяснять (если коротко, то там класс по ссылке передается)).
     
  6. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Зачем?
    Что мешает просто переприсвоить им новые значения?

    Если нужно убить вообще ВСЕ свойства - то кто мешает создать новый класс, присвоить то что нужно и отдать его?

    Точно?

    Тогда
    42
     
  7. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Да, некоторые переменны будут совпадать именами и они перезапишутся. Но останутся, так сказать, «лишние» переменные тоже. А они мне не нужны.

    Нет, этот класс только один раз создается «новым» ($config = new Config). Когда я вызываю его в других местах (уже так — $this->config =& load('Config');), то он передается по ссылке (&) со всеми своими переменными, которые в данный момент у него есть.
     
  8. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Хочешь тебя обрадую? Все классы и так передаются по ссылке.

    Посмотри как реализован паттерн Registry или на худой конец Singleton (хотя лучше 1й вариант).

    И храни все настройки в массиве

    PHP:
    1.  
    2. <?php
    3. class Config {
    4.     protected $_opt = array();
    5.     public function setValues(array $data) {
    6.         $this->_opt = $data;
    7.     }
    8.  
    9.     public function setValue($key, $value) {
    10.         if (array_key_exists($key, $this->_opt) {
    11.             $this->_opt[$key] = $value;
    12.         } else {
    13.             throw new Exception('Key ' . $key . ' not allowed');
    14.         }
    15.     }
    16. }
     
  9. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Ой нет, как раз таки от хранения переменных в массиве я и хотел избавиться и уже избавился. Если бы я хранил в массиве переменные, я бы и сам догадался сделать unset($this->_opt); )))
    Я же хочу, чтобы переменные были переменными и запись выглядела, например, так:
    Код (Text):
    1.  
    2. $this->config =& load('Config');
    3. echo $this->config->language;
    а не так:
    Код (Text):
    1.  
    2. $this->config =& load('Config');
    3. echo $this->config->_opt['language'];
     
  10. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest
    а как же магический метод в классе:
    PHP:
    1. <?php
    2. public function __get($key){
    3.     if (array_key_exists($key, $this->_opt){
    4.          return $this->_opt[$key];
    5.     }
    6.     else {
    7.          throw new Exception("Key {$key} not established");
    8.     }
    9. }
    10.  
    artuska, И будет тебе доступ как var_dump($config->login);
     
  11. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Бгг.

    PHP:
    1. <?php
    2. public function __get($key) {
    3.     if(array_key_exists($key, $this->_opt)) {
    4.         return $this->_opt[$key];
    5.     }
    6. }
    Вызывать как
    Код (Text):
    1. echo $obj->keyName
     
  12. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Simpliest, мы про __set() не забыли? ;)
     
  13. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    :) мне пофиг :) я извращаюсь сейчас :) в Помойке :)
     
  14. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    имхо, сделать абстрактный класс, в котором хранить общие методы, и плождить ему сколько угодно потомков, у которых будет свой набор атрибутов и общие методы от предка.

    но, без фанатизма с количеством потомков;)
     
  15. DarkElf

    DarkElf Активный пользователь

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    по-ходу, чел пытается doctrine-подобный orm изобразить))
     
  16. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    DarkElf
    У вас видимо устаревшие данные о доктрине, вот до чего они доросли:

    PHP:
    1.  
    2. <?php
    3.  
    4. /** @Entity */
    5. class MyPersistentClass
    6. {
    7.     /** @Column(type="integer") */
    8.     private $id;
    9.     /** @Column(type="string") */
    10.     private $name;
    11.     //...
    12. }
    13.  
    http://www.doctrine-project.org/documen ... ty-mapping
     
  17. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Причем если я правильно помню это генерится автоматом из yaml описаний.
     
  18. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    После загрузки идет сохранение в Doctrine\ORM\Mapping\ClassMetadata, откуда впоследствии и берется схема
     
  19. artuska

    artuska Активный пользователь

    С нами с:
    6 авг 2007
    Сообщения:
    61
    Симпатии:
    0
    Адрес:
    Riga, Latvia
    Вот, так и сделал, спасибо тебе, topas.
    «Магические» методы работают — мдя, никогда ими не пользовался, вот и не в курсе (

    Тему можно закрывать.

    (А про Доктрину это вы не в кассу)
     
  20. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    artuska
    [шёпотом] Не забывайте тех, кто отписывался в форуме чаще чем вы сами :)[/шёпотом]

    и ещё, советую не увлекаться магическими методами. Поменьше магии и побольше паттернов в архитектуре.