bless function

From: Date: Wed, 27 Oct 2004 14:10:15 +0000
Subject: bless function
Groups: php.general 
Request: Send a blank email to php-general+get-200442@lists.php.net to get a copy of this message
Ok, I think I've got it now. The code is autoexplicative, the only restriction is that the object must be converted to an array using the function obj2array instead of a direct cast. There's another ways to do this without the needless of that obj2array function, but I think this is not really a limitation. Here it is: <? function obj2array ( &$Instance ) { $clone = (array) $Instance; $rtn = $clone; while ( list ($key, $value) = each ($clone) ) {
       $aux = explode ("\0", $key);
       $newkey = $aux[count($aux)-1];
       if ( $newkey != $key ) {
           $rtn[$newkey] = &$rtn[$key];
           $rtn['___FAKE_KEYS_'][] = $newkey;
       }
} return $rtn; } function bless ( &$Instance, $Class ) { if ( ! (is_array ($Instance) ) ) {
       return NULL;
} // First drop faked keys if available foreach ( $Instance['___FAKE_KEYS_'] as $fake_key ) {
       unset ($Instance[$fake_key]);
} unset ( $Instance['___FAKE_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:<br>"; print_r ($Obj); echo "<br><br>As an array:<br>"; print_r ($Clone); $Clone["One"]=7; $Clone["Two"]=7; $Clone["Three"]=7; bless ( $Clone, TestClass ); echo "<br><br>After blessing as a TestClass instance:<br>"; print_r ($Clone); echo "<br><br>Calling sum method: "; echo $Clone->sum(); echo "<br>The array was blessed! miracle!!! ;-)<br>"; ?> Hope someone appart from me find it useful. :-)

« previous php.general (#200442) next »