|
|
|
| Доброго времени суток!
Есть у меня один класс, который создает объекты самого себя, внутри себя и есть некие данные внутри каждого объекта. Данные могут изменяться во время существования объекта. Мне нужно узнать изменились ли данные хотя бы в одном объекте. Какое может быть решение? | |
|
|
|
|
|
|
|
для: MHz
(11.09.2011 в 00:39)
| | А почему бы просто не обратиться к этим данным и сравнить с эталлонными? Или даже еще лучше, создать метода is_change(), основанный на внутренней булевой переменной класса, который бы возвращал true, если данные изменились и false, если они остались неизменными. Вы каким способом изменяете данные: непосредственно, через метод? | |
|
|
|
|
|
|
|
для: 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:04)
| | Т.е. в массиве $this->Data, помимо всего прочего может содержать еще несколько объектов этого же класса, вот как бы узнать были ли изменены данные во всех объектах.
Изменением данных можно считать вызов функций offsetSet() или offsetUnset() | |
|
|
|
|
|
|
|
для: MHz
(11.09.2011 в 13:08)
| | Введите член класса $this->is_change, присвойте по умолчанию его значение равным false (в конструкторе). А при вызовах offsetSet() или offsetUnset() изменяйте его значение на true. Создайте метод is_change() и возвращайте при его вызове значение $this->is_change. Это позволит для каждого объекта (содержащего другие такие объекты или являющимися вложенными) узнать осуществлялись ли манипуляции при помощи offsetSet() или offsetUnset(). | |
|
|
|
|
|
|
|
для: cheops
(11.09.2011 в 13:14)
| | старый добрый "флаг" | |
|
|
|
|
|
|
|
для: cheops
(11.09.2011 в 13:14)
| | Так я смогу узнать изменялись ли данные в каком либо определенном объекте, а мне нужно узнать это именно от одного, родительского объекта. Он должен знать о модификация всех вложенных объектов. У меня была мысль сделать флаг статическим, чтобы все объекты могли обращаться к нему, но мне кажется это будет не совсем верно. | |
|
|
|
|
|
|
|
для: MHz
(11.09.2011 в 13:27)
| | Опишите зачем ему это знать и для каких целей? Просто довольно сложно предложить решение, так как непонятно, как это должно выглядеть и при каких обстоятельствах... У меня сложилось мнение, что для того, чтобы нарастить дерево, все-равно придется изменять объекты (дополнять их вложенными). И как бы изменения настали, или есть какие-то эталлонные структуры, для которых нужно отслеживать изменения. В общем хотелось бы услышать больше подробностей о конечной задаче? | |
|
|
|
|
|
|
|
для: cheops
(11.09.2011 в 15:11)
| | От этого класса будут наследоваться другие классы, использующие этот для хранения информации и более удобного обращения к ней. И вот в одном из таких классов мне нужно в деструкторе проверить изменилось ли что нибудь и если изменилось записать изменения в файл. | |
|
|
|
|
|
|
|
для: MHz
(11.09.2011 в 17:12)
| | А изменилось по сравнению с чем, с каким состоянием? И нельзя ли в этом новом классе отследить изменения? Или добавление новых ветвей будет происходить в обход класса? | |
|
|
|
|
|
|
|
для: cheops
(11.09.2011 в 19:47)
| | По сравнению с начальным состоянием, а начальное состояние будет устанавливаться через конструктор. Вот, на счет отследить изменения в новом классе, не знаю как организовать. Добавление ветвей будет только в самом классе.
Т.е. я себе представляю примерно так буду работать с классом:
<?php
class MyClass extends RecursiveArrayAccess
{
public function __construct ()
{
// получение данных
parent::__construct (массивы данных);
}
public function __destruct ()
{
// если были изменения, записать их в файл
parent::toArray();
}
}
?>
|
| |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: aaanet
(11.09.2011 в 23:21)
| | Нет, не подойдет. В таком случае проще завести статическую переменную с флагом модификации, чтобы каждый объект мог изменять ее. | |
|
|
|