А ещё про сериализацию

И третий пост подряд (сразу видно что я мало того что появился на работе, а даже открыл редактор!)

Сериализация в пхп работет быстро, но нечестно — при ансериализации сеттеры повторно не срабатывают.

class FRIENDSHIP_IS_MAGIC
{
	private $Applejack;

	public function __set ( $key, $value )
	{
		if ( $key != 'Applejack' ) {
			die ("Only Applejack you bastard!\n");
		}
		if ( $value != '<3' ) {
			die ("No love -- no runtime!\n");
		}
		$this->Applejack = $value;
	}

	public function __get ( $key )
	{
		if ( $key != 'Applejack' ) {
			die ("Only Applejack you bastard!\n");
		}
		return $this->Applejack;
	}
}

$pony = new FRIENDSHIP_IS_MAGIC();
$pony->Applejack = '<3'; // I LOVE YOU!
var_dump($pony->Applejack); // string(2) "<3"
$packed_pony = serialize($pony);
$packed_pony = str_replace('s:2:"<3"', 'b:0', $packed_pony); // BLACK MAGIC
$pony = unserialize($packed_pony);
var_dump($pony->Applejack); // bool(false) -- WHERE IS MY LOVE ???

Конечно же тут я делают str_replace(), но в реальной жизни оно вполне себе может быть так что сначала засериализовали объект, сохранили в базу, а потом сеттер изменили и он уже валидирует иначе. Это беда на самом деле, прийдётся прикручивать какой-нибудь костыль.

2013.01.29 00:47