Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ООП. Наследование. Рекурсия.
 
 автор: MHz   (11.09.2011 в 00:39)   письмо автору
 
 

Доброго времени суток!
Есть у меня один класс, который создает объекты самого себя, внутри себя и есть некие данные внутри каждого объекта. Данные могут изменяться во время существования объекта. Мне нужно узнать изменились ли данные хотя бы в одном объекте. Какое может быть решение?

  Ответить  
 
 автор: cheops   (11.09.2011 в 10:23)   письмо автору
 
   для: MHz   (11.09.2011 в 00:39)
 

А почему бы просто не обратиться к этим данным и сравнить с эталлонными? Или даже еще лучше, создать метода is_change(), основанный на внутренней булевой переменной класса, который бы возвращал true, если данные изменились и false, если они остались неизменными. Вы каким способом изменяете данные: непосредственно, через метод?

  Ответить  
 
 автор: MHz   (11.09.2011 в 13:04)   письмо автору
 
   для: cheops   (11.09.2011 в 10:23)
 

Трудновато мне описать все поподробнее, лучше уж сразу предоставлю листинг.
<?php

class RecursiveArrayAccess implements ArrayAccess
{
    private 
$Data = array ();
    protected 
$ModifiedFlag FALSE;
    
    public function 
__construct ($Data = array ())
    {        
        foreach (
$Data AS $Key => $Value)
        {
            if (
is_array ($Value))
            {
                
$this->Data[$Key] = new self ($Value);
            }
            else
            {
                
$this->Data[$Key] = $Value;
            }
        }
    }
    
    public function 
offsetExists ($Key)
    {
        return isset (
$this->Data[$Key]);
    }
    
    public function 
offsetGet ($Key)
    {
        return isset (
$this->Data[$Key]) ? $this->Data[$Key] : NULL;
    }
    
    public function 
offsetSet ($Key$Value)
    {
        if (
is_array ($Value))
        {
            
$this->Data[$Key] = new self ($Value);
        }
        else
        {
            
$this->Data[$Key] = $Value;
        }
    }
    
    public function 
offsetUnset ($Key)
    {
        unset (
$this->Data[$Key]);
    }
    
    public function 
toArray ()
    {
        
$Data = array ();
        
        foreach (
$this->Data AS $Key => $Value)
        {
            if (
$Value instanceof self)
            {
                
$Data[$Key] = $Value->toArray ();
            }
            else
            {
                
$Data[$Key] = $Value;
            }
        }
        
        return 
$Data;
    }
}

?>

  Ответить  
 
 автор: MHz   (11.09.2011 в 13:08)   письмо автору
 
   для: MHz   (11.09.2011 в 13:04)
 

Т.е. в массиве $this->Data, помимо всего прочего может содержать еще несколько объектов этого же класса, вот как бы узнать были ли изменены данные во всех объектах.
Изменением данных можно считать вызов функций offsetSet() или offsetUnset()

  Ответить  
 
 автор: cheops   (11.09.2011 в 13:14)   письмо автору
 
   для: MHz   (11.09.2011 в 13:08)
 

Введите член класса $this->is_change, присвойте по умолчанию его значение равным false (в конструкторе). А при вызовах offsetSet() или offsetUnset() изменяйте его значение на true. Создайте метод is_change() и возвращайте при его вызове значение $this->is_change. Это позволит для каждого объекта (содержащего другие такие объекты или являющимися вложенными) узнать осуществлялись ли манипуляции при помощи offsetSet() или offsetUnset().

  Ответить  
 
 автор: Valick   (11.09.2011 в 13:17)   письмо автору
 
   для: cheops   (11.09.2011 в 13:14)
 

старый добрый "флаг"

  Ответить  
 
 автор: MHz   (11.09.2011 в 13:27)   письмо автору
 
   для: cheops   (11.09.2011 в 13:14)
 

Так я смогу узнать изменялись ли данные в каком либо определенном объекте, а мне нужно узнать это именно от одного, родительского объекта. Он должен знать о модификация всех вложенных объектов. У меня была мысль сделать флаг статическим, чтобы все объекты могли обращаться к нему, но мне кажется это будет не совсем верно.

  Ответить  
 
 автор: cheops   (11.09.2011 в 15:11)   письмо автору
 
   для: MHz   (11.09.2011 в 13:27)
 

Опишите зачем ему это знать и для каких целей? Просто довольно сложно предложить решение, так как непонятно, как это должно выглядеть и при каких обстоятельствах... У меня сложилось мнение, что для того, чтобы нарастить дерево, все-равно придется изменять объекты (дополнять их вложенными). И как бы изменения настали, или есть какие-то эталлонные структуры, для которых нужно отслеживать изменения. В общем хотелось бы услышать больше подробностей о конечной задаче?

  Ответить  
 
 автор: MHz   (11.09.2011 в 17:12)   письмо автору
 
   для: cheops   (11.09.2011 в 15:11)
 

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

  Ответить  
 
 автор: cheops   (11.09.2011 в 19:47)   письмо автору
 
   для: MHz   (11.09.2011 в 17:12)
 

А изменилось по сравнению с чем, с каким состоянием? И нельзя ли в этом новом классе отследить изменения? Или добавление новых ветвей будет происходить в обход класса?

  Ответить  
 
 автор: MHz   (11.09.2011 в 20:35)   письмо автору
 
   для: cheops   (11.09.2011 в 19:47)
 

По сравнению с начальным состоянием, а начальное состояние будет устанавливаться через конструктор. Вот, на счет отследить изменения в новом классе, не знаю как организовать. Добавление ветвей будет только в самом классе.
Т.е. я себе представляю примерно так буду работать с классом:
<?php

class MyClass extends RecursiveArrayAccess
{
    public function 
__construct ()
    {
        
// получение данных
        
parent::__construct (массивы данных);
    }

    public function 
__destruct ()
    {
        
// если были изменения, записать их в файл
        
parent::toArray();
    }
}

?>

  Ответить  
 
 автор: aaanet   (11.09.2011 в 23:21)   письмо автору
 
   для: MHz   (11.09.2011 в 00:39)
 

Изменение данных - понятие растяжимое.
Может измениться часть строки, а может измениться количество чего либо.

Мне кажется Вам просто нужен синглтон, через который будут работать все остальные методы.

func s($method, $var)
{
static $data[$method] = array();
if ($data[$method] == null) return class -> $method($var);
else return $data[$method];
}

Cxbnfnm d ytv dspjds b ,skb kb jyb djj,ot yt cjcnfdkztn ghj,ktvs

  Ответить  
 
 автор: MHz   (11.09.2011 в 23:51)   письмо автору
 
   для: aaanet   (11.09.2011 в 23:21)
 

Нет, не подойдет. В таком случае проще завести статическую переменную с флагом модификации, чтобы каждый объект мог изменять ее.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования