PHP object serialize #3

Gondoltam nyomozgatok még egy picit a PHP objektumok és a serialize() függvény rejtélyes kapcsolatáról, ha már ma sikerült újabb örömteli perceket szereznie, miután már egyszer kimondhatatlanul boldoggá tett.

Délután, munkából hazafelé menet elgondolkoztam azon, hogy mi lehet akkor, ha a gyermekosztályban létezik egy ugyanolyan nevű private adattag. Csodák-csodájára, így működik a __sleep() -l. Csodálatos.

class A 
{
	private $a = 'a';
	
	public function printvar()
	{
		echo 'A::a = '.$this->a."\n";
	}
}

class B extends A
{
	private $a = 'b';
	
	public function printvar()
	{
		parent::printvar();
		echo 'B::a = '.$this->a."\n";
	}

	public function __sleep()
	{
		return array('a');
	}
}

$a = new A;
$b = new B;

$oa = unserialize(serialize($a));
$ob = unserialize(serialize($b));

$oa->printvar();
echo "-\n";
$ob->printvar();

Kimenet:

A::a = a
-
A::a = a
B::a = b

Viszont vannak még itt további érdekességek, mint pl. a get_class_vars() nevű csodálatos függvény. Működésére jellemző, hogy azonos nevű leszármazott esetén az ősosztályban lévő értéket hagyja meg.

Mondjuk szerintem a Serializable::Unserialize() is egy érdekes elgondolást követ (konstruktor helyett konstruktorként viselkedik), de ez legalább használható. Csak fapados, lehet megírni kézzel mindent.

Hozzászólások

Nezz bele a php forrasaba, ahol megvalositjak ezeket a fuggvenyeket ha szeretnel nagyon elborzadni (egy nagy ganyolas az egesz) :D