Эти методы, возможно, понадобятся вам, когда вы столкнётесь с сериализацией экземпляров класса. Подробное рассмотрение этого понятия немного выходит за рамки этой статьи, но для того, чтобы понять, зачем эти методы всё же нужны, знать что такое сериализация вам не помешает.
Сериализация – это процесс представления какой-либо структуры данных (экземпляра класса, ассоциативного массива и т.д.) в виде последовательности байтов.
В php для сериализации используется функция serialize. Для десериализации объекта, то есть для восстановления изначального состояния сериализованного объекта в php есть функция unserialize.
$p = new Point(new PointPrinter(), 20, 10); $str = serialize($p); echo "$str "; // O:5:"Point":3:{s:8:"Pointx";i:20;s:8:"Pointy";i:10;… $p = unserialize($str); echo "({$p->x}, {$p->y})"; // (20, 10)
Метод __sleep вызывается при попытке сериализовать экземпляр класса. Он должен возвращать массив, который содержит имена полей класса, которые должны быть учтены при сериализации. Его полезно использовать, если вы не хотите чтобы при сериализации были учтены некоторые поля класса. Например, при такой реализации у экземпляра класса Point поле $printer не будет учтёно при сериализации.
public function __sleep() { return array('x', 'y'); }
Метод __wakeup вызывается при попытке десериализовать экземпляр класса. В его теле можно, например проверить или восстановить соединение с БД или файлом откуда будет читаться сериализованный экземпляр.