ID: 31536 Updated by: [EMAIL PROTECTED] Reported By: exaton at free dot fr Status: Open Bug Type: SimpleXML related Operating System: WinXP SP2 PHP Version: 5CVS-2005-01-13 (dev) New Comment:
I'm sorry, little snippet I forgot to include: this should be moved to php.internals as it's not a bug...yet. I was actually wrong to reply here. Previous Comments: ------------------------------------------------------------------------ [2005-01-14 02:44:02] [EMAIL PROTECTED] I find it odd that PHP does this anyway. I don't think that you should be able to name any variable, class or outside, after a keyword (even with $). Regardless of how you use ->, C doesn't let you do this at all. It'll throw obscure parse errors like: test.c(2) : error C2632: 'int' followed by 'double' is illegal test.c(2) : error C2208: 'int' : no members defined using this type > int double; This is simply better in the long run for the compiler, because for each occurance of .double or ->double, the compiler doesn't need to check its symbol table to know whether or not you're really stupid enough to name a struct var double -- it knows to plainly call you stupid. This saves time during a compile (much, I can imagine). SimpleXML, I'm pretty sure, is implemented using __get() (?), but I imagine having this kind of flexibility in PHP allows for classes like SimpleXML to exist, as well as things like FFI (ffi_struct). I'd call this my two cents, but my checking account is overdrawn. I owe you two cents. ------------------------------------------------------------------------ [2005-01-13 12:05:08] exaton at free dot fr Description: ------------ Note : I wish I could call this "remark" as opposed to "bug", because I don't really suppose it can be solved, anyway. The exact version of PHP used is the Jan 12 2005 18:14:35 5.0.4-dev Win32 snapshot. When accessing object members, I am in the habit of putting spaces on either side of the object/arrow operator "->" for clarity. It is a known situation that with such practice, the right-hand argument (the object member) had better not be named after a PHP keyword. For example : class A { public $list; public function __construct() { $this -> list = 'value'; // (*) } } Line (*) generates a parse error, unexpected T_LIST, expecting T_STRING or T_VARIABLE or '{' or '$'. That is easily resolved : it would extremely bad practice to name a member thus anyway. But what of XML nodes seen as SimpleXML objects ? <?xml version="1.0"?> <root> <list>item1, item2, item3</list> </root> $xml = simplexml_load_string/file(/* what is above */); foreach ($xml -> list as $elemList) { // (**) // manage the list, e.g. make it into an array... } Exact same problem as before on line (**), of course, because of how SimpleXML gives access to child nodes. The issue here is that I am not the one writing the XML file, defining its XML Schema, etc. ; so I can no longer solve the problem with better naming practice. And imposing PHP practice in PHP code is consistent : it seems less so to impose PHP practice to an otherwise independant XML file. Easiest workaround : drop the spacing on either side (or at least, the right-hand side) of the object operator, and live up the ensuing slight ugliness. But might not something be done at a deeper level ? I imagine this crops up for all reserved words, that the parser will see as special tokens before considering that they might be object members. But the thing is, I cannot think of any context in which the right-hand argument of an object access might _want_ to be the PHP keyword, with the functionnality induced. I.e. is it possible for "$obj -> list" to mean anything with regard to what "list" means for PHP ? Same for the other reserved words as far as five minutes' pondering can make out. As I said in introduction, I don't expect it is really feasible to clear this "bug", as in make the parser see the right-hand argument of a "->" operation as a systematic object member and never imagine that it might be a special token, but I would be interested in someone from PHP providing a quick thought on this. Thank you. ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/?id=31536&edit=1