bless function

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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. :-)

--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux