Edit report at http://bugs.php.net/bug.php?id=52251&edit=1
ID: 52251 Updated by: [email protected] Reported by: giorgio dot liscio at email dot it Summary: in __set() $obj->{222} = $foo; 222 is casted to string -Status: Open +Status: Bogus Type: Bug Package: Scripting Engine problem Operating System: all? PHP Version: 5.3.2 Block user comment: N New Comment: Not a bug. Previous Comments: ------------------------------------------------------------------------ [2010-07-30 08:52:53] bastard dot internets at gmail dot com Woops! I was too quick. For associate arrays, instead of building the complete string manually, you just cast the object to string... $array[(string) new Obj] = 1; ------------------------------------------------------------------------ [2010-07-30 08:45:35] bastard dot internets at gmail dot com giorgio dot liscio at email dot it - your last example... $myarray[new MyClass()] = "foo"; ... is solvable by doing this, provided a __toString method is declared... // for associative array, you have to manually build the string $array["'".new MyClass('key1')."'"] = "foo"; $array["'".($obj = new MyOtherClass("test", "something"))."'"] = $obj->prop2; // for numbered array, you first have to have __toString cast the numeric property to (string) before returning $array[(int) (string) new MyThirdClass(222)] = "foo"; A __toScalar would be really nice. But a problem still is the processor wouldn't know if you meant for the array key to be a string, an int, a constant, or what. ------------------------------------------------------------------------ [2010-07-05 21:00:13] giorgio dot liscio at email dot it arrayaccess interface has a different behavior and allows to pass instances as keys anyway there's another issue about "classic" arrays $myarray[new MyClass()] = "foo"; when used in this context, the instance should call __toString to return the key as string... or toScalar in the next php releases ------------------------------------------------------------------------ [2010-07-05 14:35:24] giorgio dot liscio at email dot it Description: ------------ hi class MyArray { public function __set($i,$v){var_dump($i);} public function __get($i){var_dump($i);} } $obj = new MyArray(); $obj->{222} = "foo"; echo $obj->{222}; i think the index of the __set __get magic methods should be as user passed with the characteristics of a "php's valid array key" but in plus... would be nice if the key accepts all types too $hashtable->{new User(2222)} = new SomeUserData(2222); here User is casted to "string" and it is good for hash tables, but inside the __set method is impossible to access the original "new User" instance ------------------------------------------------------------------------ -- Edit this bug report at http://bugs.php.net/bug.php?id=52251&edit=1
