waArrayObjectDiff

Хранение значений с доступом к ним, как в массивах, и с отслеживанием изменений

Содержание...

Класс позволяет организовать иерархическое хранение значений с равнозначным доступом к ним как к элементам многомерных массивов или объектов, содержащих коллекции объектов, — так же, как и родительский класс waArrayObject.

Отличие waArrayObjectDiff от родительского класса в том, что он также позволяет запоминать изменения значений свойств объекта и затем либо окончательно применять их, либо отменять. До применения или отмены временных изменений можно просматривать их содержимое; после применения или отмены временных изменений их содержимое очищается.

Примеры

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

// сделать временное изменение
$object->foo = 300;

wa_dumpc(
    $object->toArray(), // ['foo' => 300, 'bar' => 200]
    $object->diff()     // ['foo' => 300]
);

// а) отменить изменение
$object->revert();

wa_dumpc(
    $object->toArray(), // ['foo' => 100, 'bar' => 200]
    $object->diff()     // []
);

// или

// б) применить изменение
// $object->merge();
//
// wa_dumpc(
//       $object->toArray(), // ['foo' => 300, 'bar' => 200]
//       $object->diff()     // []
// );

Методы

  • __construct

    Конструктор класса.

  • diff

    Возвращает значения временных изменений в свойствах объекта.

  • merge

    Применяет временные изменения в значениях свойств объекта.

  • revert

    Отменяет временные изменения в значениях свойств объекта.

  • clearPersistent

    Очищает постоянные значения, хранящиеся в свойствах объекта.

  • getPersistent

    Возвращает экземпляр класса waArrayObject, в котором хранятся постоянные значения свойств объекта.

  • setPersistent

    Устанавливает экземпляр класса waArrayObject, в котором хранятся постоянные значения свойств объекта.

  • restorePersistentInvariant

    Восстанавливает корректную структуру данных после внесения изменений в свойство объекта persistent.

public function __construct ($persistent = [])

Конструктор класса.

Параметры

  • $persistent

    Значение, реализующее интерфейс Traversable, или экземпляр класса waArrayObject.

Пример

// вариант 1
$array_object_diff = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

// вариант 2
$array_object_ = new waArrayObject([
    'foo' => 100,
    'bar' => 200,
]);

$array_object_diff = new waArrayObjectDiff($array_object_);

public function diff ($new = true)

Возвращает значения временных изменений в свойствах объекта.

Параметры

  • $new

    Режим возвращаемого значения:

    • true: вернуть массив новых значений изменённых свойств.
    • false: вернуть массив старых значений изменённых свойств — в том числе если старое значение было удалено конструкцией unset().

Пример

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

$object->foo = 300;

wa_dump(
    $object->diff(true),  // ['foo' => 300]
    $object->diff(false), // ['foo' => 100]
);

Пример

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

unset($object->foo);

wa_dump(
    $object->diff(true),  // []
    $object->diff(false), // ['foo' => 100]
);

public function merge()

Применяет временные изменения в значениях свойств объекта.

Пример

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

$object->foo = 300;
$object->merge();

// содержимое изменений
wa_dump($object->diff(true)); // []

public function revert()

Отменяет временные изменения в значениях свойств объекта.

Пример

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

$object->foo = 300;
$object->revert();

wa_dump($object->toArray());

Результат

[
    'foo' => 100,
    'bar' => 200,
]

public function clearPersistent()

Очищает постоянные значения свойств объекта и переносит их в хранилище временных изменений. После этого объект находится в том же состоянии, как если бы для пустого объекта выполнили запись временных изменений и ещё не применили их методом merge().

Пример

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

wa_dumpc(
    $object->toArray(),  // ['foo' => 100, 'bar' => 200]
    $object->diff()      // []
);

// очистить постоянные значения
// и перенести их во временные изменения
$object->clearPersistent();

wa_dumpc(
    $object->toArray(),  // ['foo' => 100, 'bar' => 200]
    $object->diff()      // ['foo' => 100, 'bar' => 200]
);

// удалить временные изменения
// постоянные значения уже удалены методом clearPersistent()
$object->revert();

wa_dumpc(
    $object->toArray(),  // []
    $object->diff()      // []
);

public function getPersistent()

Возвращает экземпляр класса waArrayObject, в котором хранятся постоянные значения свойств объекта.

Пример

$object = new waArrayObjectDiff([
    'foo' => 100,
    'bar' => 200,
]);

wa_dump($object->getPersistent());

Результат

waArrayObject object {
    *rec_data => [
      'foo' => 100,
      'bar' => 200,
    ]
    *stub => false
}

public function setPersistent (waArrayObject $p)

Устанавливает экземпляр класса waArrayObject, в котором хранятся постоянные значения свойств объекта.

Пример

$object = new waArrayObjectDiff();
$object->setPersistent(new waArrayObject([
    'foo' => 100,
    'bar' => 200,
]));

public function restorePersistentInvariant()

Восстанавливает корректную структуру данных после внесения изменений в свойство объекта persistent, например, в коде классов-наследников.

Пример

class myArrayObjectDiff extends waArrayObjectDiff
{
    public function setPersistentValue ($name, $value)
    {
        $this->persistent[$name] = $value;
        $this->restorePersistentInvariant();
    }
}