Я работаю с PHP уже несколько лет, но до сих пор никогда не было необходимости иметь дело с сериализацией явно, только с использованием $_SESSION
.Теперь у меня есть проект, который требует от меня вручную реализовать механизм сериализации для определенных данных - и я понимаю, что проблема применима и к $_SESSION
.
У меня есть класс, который содержит ряд свойств.Большинство этих свойств невелики (как при использовании памяти): числа, относительно короткие строки и т. Д. Однако класс также содержит некоторые свойства, которые могут содержать ОГРОМНЫЕ массивы (например, весь дамп таблицы базы данных: 100 000 строк по 100 полей в каждом).).Как это происходит, это один из классов, который необходимо сериализовать / десериализовать - и, к счастью, свойства, содержащие большие массивы, не нужно сериализовать, поскольку они по сути являются временными элементами работы и в любом случае перестраиваются по мере необходимости.
При таких обстоятельствах в Java я просто объявил бы свойство как transient
- и оно было бы исключено из serialisaion.К сожалению, PHP не поддерживает такие классификаторы.
Один из способов справиться с этим - получить что-то вроде этого:
class A implements Serializable
{
private $var_small = 1234;
private $var_big = array( ... ); //huge array, of course, not init in this way
public function serialize()
{
$vars = get_object_vars($this);
unset($vars['var_big']);
return serialize($vars);
}
public function unserialize($data)
{
$vars = unserialize($data);
foreach ($vars as $var => $value) {
$this->$var = $value;
}
}
}
Однако это довольно громоздко, так как мне нужно обновитьserialize
метод каждый раз, когда я добавляю другое временное свойство.Кроме того, как только наследование вступает в игру, это становится еще более сложным - иметь дело с, так как переходные свойства могут быть как в подклассе, так и в родительском.Я знаю, это все еще выполнимо, однако я бы предпочел делегировать как можно больше языку, а не изобретать колесо.
Итак, как лучше всего справиться с переходными свойствами?Или я что-то упустил и PHP поддерживает это из коробки?