«Переходные» свойства в классе PHP?Php

Кемеровские программисты php общаются здесь
Anonymous
«Переходные» свойства в классе PHP?

Сообщение Anonymous »


Я работаю с PHP уже несколько лет, но до сих пор мне никогда не приходилось иметь дело с сериализацией явно, только используя $_SESSION. Теперь у меня есть проект, который требует от меня вручную реализовать механизм сериализации для определенных данных, и я понимаю, что проблема применима и к $_SESSION.

У меня есть класс, который содержит ряд свойств. Большинство из этих свойств невелики (например, потребление памяти): числа, относительно короткие строки и т. д. Однако класс также содержит некоторые свойства, которые могут содержать ОГРОМНЫЕ массивы (например, весь дамп таблицы базы данных: 100 000 строк по 100 полей в каждом). ). Как оказалось, это один из классов, который необходимо сериализовать/десериализовать - и, к счастью, свойства, содержащие большие массивы, сериализовать не нужно, поскольку они, по сути, являются временными фрагментами работы и в любом случае перестраиваются по мере необходимости.

В таких обстоятельствах в Java я бы просто объявил свойство как transient — и оно было бы исключено из сериализации. К сожалению, PHP не поддерживает такие квалификаторы.

Один из способов справиться с этим — сделать что-то вроде этого:

Класс A реализует Serializable { частный $var_small = 1234; частный $var_big = массив (...); //огромный массив, конечно, не инициализируем таким образом публичная функция сериализации() { $vars = get_object_vars($this); unset($vars['var_big']); вернуть сериализацию ($ vars); } публичная функция unserialize($data) { $vars = десериализовать ($ данные); foreach ($vars as $var => $value) { $this->$var = $value; } } } Однако это довольно громоздко, так как мне придется обновлять метод serialize каждый раз, когда я добавляю другое временное свойство. Кроме того, как только наследование вступает в игру, это становится еще более сложным, поскольку временные свойства могут находиться как в подклассе, так и в родительском классе. Я знаю, что это все еще возможно, однако я бы предпочел как можно больше делегировать языку, а не изобретать велосипед.

Итак, как лучше всего справиться с временными свойствами? Или я что-то упускаю и PHP поддерживает это «из коробки»?

Вернуться в «Php»