ID: 46416 User updated by: bugzilla at zuavra dot net Reported By: bugzilla at zuavra dot net Status: Bogus Bug Type: Scripting Engine problem Operating System: * PHP Version: 5.3.0alpha2 New Comment:
Yeah, I expected I might get the canned response for this one. I still think it doesn't make sense for each() to behave in a completely unpredictable manner. I suspect the rationalization for this is that each() accesses objects in "string context" as opposed to "object/class context" and therefore it need not observe access modifiers. However, it doesn't explain why foreach should behave otherwise. I also saw rationalization for print_r, var_dump etc. in that those are special and that they should be allowed unobstructed view of objects. I don't see how that applies to each(). At the very least please consider making each() return proper names for private/protected variables. If there are internal engine considerations that require that each() be kept (partially or totally) with these inconsistencies, for now or for longer, please say so in this or another bug report, otherwise I suspect this issue may very well keep on being raised. Previous Comments: ------------------------------------------------------------------------ [2008-10-29 11:30:54] [EMAIL PROTECTED] Thank you for taking the time to write to us, but this is not a bug. Please double-check the documentation available at http://www.php.net/manual/ and the instructions on how to report a bug at http://bugs.php.net/how-to-report.php ------------------------------------------------------------------------ [2008-10-29 10:06:26] bugzilla at zuavra dot net Description: ------------ Using each() to iterate through an object will produce weird results in two respects: 1. It will expose private and protected members alongside public ones. 2. For private and protected members, the keys (names) are jumbled. Yes, I know that this behaviour is known and that the manual page for each() warns about this. But such an inconsistency should not exist. Desirable consistent behaviour: a) Produce the same results as foreach() (show only public members). or b) Refuse to work with objects altogether and state so in the manual. Reproduce code: --------------- <?php class Example { private $priv = 1; protected $prot = 2; public $pub = 3; } $obj = new Example(); while (list($key, $val) = each($obj)) { printf("%s = %s\n", $key, $val); } ?> Expected result: ---------------- pub = 3 Actual result: -------------- [NUL]Example[NUL]priv = 1 [NUL]*[NUL]prot = 2 pub = 3 where [NUL] is the null (0x00) character ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=46416&edit=1
