«Временные» свойства в классе PHP?

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

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

В таких обстоятельствах в Java я бы просто объявил свойство как transient - и оно было бы исключено из сериализации. К сожалению, 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 поддерживает это из коробки?

9
задан Jeremy Harris 2 February 2012 в 15:26
поделиться