note 47075 added to function.get-object-vars

From: Date: Tue, 02 Nov 2004 07:53:37 +0000
Subject: note 47075 added to function.get-object-vars
Groups: php.notes 
Request: Send a blank email to php-notes+get-79480@lists.php.net to get a copy of this message
You can still cast the object to an array to get all its members and see its visibility. Example: <?php class Potatoe { public $skin; protected $meat; private $roots; function __construct ( $s, $m, $r ) { $this->skin = $s; $this->meat = $m; $this->roots = $r; } } $Obj = new Potatoe ( 1, 2, 3 ); echo "<pre>\n"; echo "Using get_object_vars:\n"; $vars = get_object_vars ( $Obj ); print_r ( $vars ); echo "\n\nUsing array cast:\n"; $Arr = (array)$Obj; print_r ( $Arr ); ?> This will returns: Using get_object_vars: Array ( [skin] => 1 ) Using array cast: Array ( [skin] => 1 [ * meat] => 2 [ Potatoe roots] => 3 ) As you can see, you can obtain the visibility for each member from this cast. That which seems to be spaces into array keys are '\0' characters, so the general rule to parse keys seems to be: Public members: member_name Protected memebers: \0*\0member_name Private members: \0Class_name\0member_name I've wroten a obj2array function that creates entries without visibility for each key, so you can handle them into the array as it were within the object: <?php 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; } ?> I've created also a <i>bless</i> function that works similar to Perl's bless, so you can further recast the array converting it in an object of an specific class: <?php 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 ); 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; } ?> With these ones you can do things like: <?php define("SFCMS_DIR", dirname(__FILE__)."/.."); require_once (SFCMS_DIR."/Misc/bless.php"); class Potatoe { public $skin; protected $meat; private $roots; function __construct ( $s, $m, $r ) { $this->skin = $s; $this->meat = $m; $this->roots = $r; } function PrintAll () { echo "skin = ".$this->skin."\n"; echo "meat = ".$this->meat."\n"; echo "roots = ".$this->roots."\n"; } } $Obj = new Potatoe ( 1, 2, 3 ); echo "<pre>\n"; echo "Using get_object_vars:\n"; $vars = get_object_vars ( $Obj ); print_r ( $vars ); echo "\n\nUsing obj2array func:\n"; $Arr = obj2array($Obj); print_r ( $Arr ); echo "\n\nSetting all members to 0.\n"; $Arr['skin']=0; $Arr['meat']=0; $Arr['roots']=0; echo "Converting the array into an instance of the original class.\n"; bless ( $Arr, Potatoe ); if ( is_object ($Arr) ) { echo "\$Arr is now an object.\n"; if ( $Arr instanceof Potatoe ) { echo "\$Arr is an instance of Potatoe class.\n"; } } $Arr->PrintAll(); ?> ---- Manual Page -- http://www.php.net/manual/en/function.get-object-vars.php Edit -- http://master.php.net/manage/user-notes.php?action=edit+47075 Delete -- http://master.php.net/manage/user-notes.php?action=delete+47075&report=yes Reason: bad code -- http://master.php.net/manage/user-notes.php?action=delete+47075&report=yes&reason=bad+code Reason: spam -- http://master.php.net/manage/user-notes.php?action=delete+47075&report=yes&reason=spam Reason: useless example -- http://master.php.net/manage/user-notes.php?action=delete+47075&report=yes&reason=useless+example Reason: contains commercial links -- http://master.php.net/manage/user-notes.php?action=delete+47075&report=yes&reason=contains+commercial+links Reason: useless note -- http://master.php.net/manage/user-notes.php?action=delete+47075&report=yes&reason=useless+note Reject -- http://master.php.net/manage/user-notes.php?action=reject+47075&report=yes Search -- http://master.php.net/manage/user-notes.php

« previous php.notes (#79480) next »