Я работал с PHP уже несколько лет, но до сих пор мне не приходилось иметь дело с сериализацией явно, используя только $_SESSION
. Теперь у меня есть проект, который требует от меня вручную реализовать механизм сериализации для определенных данных - и я понимаю, что проблема применима и к $_SESSION
."Переходные" свойства в классе PHP?
У меня есть класс, который содержит ряд свойств. Большинство из этих свойств малы (как в потреблении памяти): числа, относительно короткие строки и т. Д. Однако класс также содержит некоторые свойства, которые могут содержать массивы HUGE (например, весь дамп таблицы базы данных: 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 поддерживает это из коробки?
'__sleep' не будет работать с приватными свойствами в родительском классе, поэтому это полезно только при условии, что наследование не задействовано. –
@AleksG ha! У меня есть решение, которое работает! Взгляните :) – Vyktor
Спасибо, это похоже на жизнеспособный подход. Я немного экспериментирую с этим, чтобы посмотреть, как это работает. –