Pull to refresh

Comments 26

на php.net этот раздел справки дополнен/исправлен — там как раз есть return array(...);
ага, пример обновили
UFO just landed and posted this here
оно было обновлено более чем полгода назад. есть мнение, что автор поста пользуется документацией годовой давности.
именно так, chm годовалый.
ну тогда и проверять нужно было на релизе годовалой давности, для которого документация была актуальна.
странно, что вы вообще не взяли php 4, в котором этих магических методов нет.
Ага и что же изменилось за год в релизах?
Серия незначительных баг-фиксов.
5.3 еще не релиз.
Нужно регулярно обновлять мануалы. Потому что даже в старых и проверенных функциях бывают изменения. Например добавляют ещё один параметр. Нужно быть в курсе всех изменений, чтобы потом не городить велосипеды, а потом оказывается всё это реализовано в стандартной функции, которая отсутствует в старом мануале.
> __wakeup вызывается после unserialize, чтоб можно было автоматом необходимые связи вернуть в зад.

Куда, куда вернуть???
Не факт, что болит. Может человек хотел сказать, что «взад» в данном случае пишется слитно.
Не знаю у кого там что болит, но, уважающие своих читателей авторы, перечитывают свои заметки перед публикацией, чтобы не допускать таких ляпов.
я считаю что уважающие себя читатели, которые стремятся подчеркнуть для себя что-то интересное и новое, не должны обращать внимание на мелкие ошибки или по оплошности допущенные ляпы
даже в старой версии 2008-12-26 документации уже не было этого примера
не вводите людей в заблуждение
нашёл версию от 07-03-2005
примеров там нет вообще, но зато есть такой вот текст:

«serialize() checks if your class has a function with the magic name __sleep. If so, that function is executed prior to any serialization. It can clean up the object and is supposed to return an array with the names of all variables of that object that should be serialized. „
Пожалуйста, пожалуйста, исправьте слово «ньюанс» в заголовке.
Рекомендуется к прочтению: SPL: Serializable Interface

Пример использования:

class A implements Serializable {
        private $x='y';
        function __construct()
        {
                echo __METHOD__ . " called\n";
        }
        function __destruct()
        {
                echo __METHOD__ . " called\n";
        }
        function serialize()
        {
                return $this->x;
        }
        function unserialize($s)
        {
                $this->x=$s;
        }
}
class B {
        private $x='y';
        function __construct()
        {
                echo __METHOD__ . " called\n";
        }
        function __destruct()
        {
                echo __METHOD__ . " called\n";
        }
        function __sleep()
        {
                return array('x');
        }
}

echo "Serializable (the new way)\n";
$x1=new A;
$s=serialize($x1);
var_dump($s);
$y1=unserialize($s);
var_dump($y1);

echo "__sleep/__wakeup (the old way)\n";
$x2=new B;
$s=serialize($x2);
var_dump($s);
$y2=unserialize($s);
var_dump($y2);
ага SPL снова рулит )))
фишка в том что этот подход тоже не панацея, он позволяет поймать события и реализовать сериализацию своим путем.

Но вернемся к задаче:
Перед сериализацией обнулить ссылку на объект бд, сохранив все остальное.

Метод serialize интерфейса Serializable должен вернуть строковое представление объекта.

class A implements Serializable
{
private $db;
private $data = 12312312;

public function serialize()
{
$this->db = null;
return serialize($this);
}

public function unserialize($s)
{

}
}

$a = new A();
serialize($a);

в результате выполнения схватим Fatal error: Maximum function nesting level of '100' reached, aborting!

То есть нужна именно сериализация, это не спасает без тонны гвоздей.
зачем обнулять хандлер $db?
сериализовывать нужно не сам объект, а данные.
что удивительного в том, что ты вызвал рекурсию и получил фатал?
Вы не вполне разобрались в предмете. Почитайте материал еще раз, попробуйте разные варианты подходов к сериализации — на практике.
Вот если бы кто-то унаследовал SimpleXMLElement и научил его сериализироваться…
Sign up to leave a comment.

Articles