Giving it a round, this seems to be a better aproach than the previous
one. It has the advantage of provide direct access to the original array
obtained from casting without boring about ___FAKE_KEYS_.
function obj2array ( &$Instance ) {
$clone = (array) $Instance;
$rtn = array ();
$rtn['___SOURCE_KEYS_'] = $clone;
while ( list ($key, $value) = each ($clone) ) {
$aux = explode ("\0", $key);
$newkey = $aux[count($aux)-1];
$rtn[$newkey] = &$rtn['___SOURCE_KEYS_'][$key];
}
return $rtn;
}
function bless ( &$Instance, $Class ) {
if ( ! (is_array ($Instance) ) ) {
return NULL;
}
// First get source keys if available
if ( isset ($Instance['___SOURCE_KEYS_'])) {
$Instance = $Instance['___SOURCE_KEYS_'];
}
// Get serialization data from array
$serdata = serialize ( $Instance );
/* For an array serialized data seems to meant:
array_tag:array_count:{array_elems}
array_tag is always 'a'
array_count is the number of elements in the array
array_elems are the elemens in the array
For an object seems to meant:
object_tag:object_class_name_len:"object_class_name":object_count:{object_members}
object_tag is always 'O'
object_class_name_len is the length in chars of
object_class_name string
object_class_name is a string with the name of the class
object_count is the number of object members
object_members is the object_members itself (exactly equal to
array_elems)
*/
list ($array_params, $array_elems) = explode ('{', $serdata, 2);
list ($array_tag, $array_count) = explode (':', $array_params, 3 );
$serdata = "O:".strlen
($Class).":\"$Class\":$array_count:{".$array_elems;
$Instance = unserialize ( $serdata );
return $Instance;
}
class TestClass {
private $One=1;
protected $Two=2;
public $Three=3;
public function sum() {
return $this->One+$this->Two+$this->Three;
}
}
$Obj = new TestClass ();
//$Clone = (array) $Obj;
$Clone = obj2array ( $Obj );
echo "As the original object:";
print_r ($Obj);
echo "As an array:";
print_r ($Clone);
$Clone["One"]=7;
$Clone["Two"]=7;
$Clone["Three"]=7;
bless ( $Clone, TestClass );
echo "After blessing as a TestClass instance:";
print_r ($Clone);
echo "Calling sum method: ";
echo $Clone->sum();
echo "The array was blessed! miracle!!! ;-)";
?>
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php