[RFC] Convert numeric keys in object/array casts

php.internals

Andrew Faulds

9 years ago
Hi everyone, To try and fix a longstanding issue, and to actually bring some attention to the fix, I've created a new RFC, which can be found here: https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts It targets PHP 7.2, which is maybe a little conservative. It could target PHP 7.1 theoretically, but it's probably a bit late for that. I'm also not sure if this really ought to be an RFC, but I've received little feedback so far, so it can't hurt. Anyway, please tell me your thoughts!
-- Andrea Faulds https://ajf.me/

Yasuo Ohgaki

9 years ago
Hi Andrea, On Sat, Oct 22, 2016 at 8:11 AM, Andrea Faulds <ajf@ajf.me> wrote:
> To try and fix a longstanding issue, and to actually bring some attention to > the fix, I've created a new RFC, which can be found here: > > https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts > > It targets PHP 7.2, which is maybe a little conservative. It could target > PHP 7.1 theoretically, but it's probably a bit late for that. > > I'm also not sure if this really ought to be an RFC, but I've received > little feedback so far, so it can't hurt.
Nice RFC! It seems patch is made to convert int index to string index to allow numeric key, is it? I guess it is the limitation and the reason why it's inaccessible. Numeric key name must be string? $obj->{'0'} = 1; or could be like (Without quotes) $obj->{0} = 1; Regards,
-- Yasuo Ohgaki yohgaki@ohgaki.net

Yasuo Ohgaki

9 years ago
On Sun, Oct 23, 2016 at 4:59 AM, Yasuo Ohgaki <yohgaki@ohgaki.net> wrote:
> Numeric key name must be string? > > $obj->{'0'} = 1; > > or could be like (Without quotes) > > $obj->{0} = 1;
It seems variables can be numeric now. https://3v4l.org/bjZ4d Regards,
-- Yasuo Ohgaki yohgaki@ohgaki.net

Davey

9 years ago
This has been the case since 4.3 at the least: https://3v4l.org/bjZ4d On Sat, Oct 22, 2016 at 22:48 Yasuo Ohgaki <yohgaki@ohgaki.net> wrote:

Andrew Faulds

9 years ago
Hi Yasuo, Yasuo Ohgaki wrote:
> Nice RFC! > > It seems patch is made to convert int index to string index to allow > numeric key, is it?
Or vice-versa, yes.
> I guess it is the limitation and the reason why > it's inaccessible.
Yes. If you have an object whose HashTable has an integer key, say 123, and you try to look up the object property 123, it will look for the string key "123", and will not find it.
> Numeric key name must be string? > > $obj->{'0'} = 1; > > or could be like (Without quotes) > > $obj->{0} = 1;
Both are supported, either way it converts to a string key.
-- Andrea Faulds https://ajf.me/

Stas Malyshev

9 years ago
Hi!
> To try and fix a longstanding issue, and to actually bring some > attention to the fix, I've created a new RFC, which can be found here: > > https://wiki.php.net/rfc/convert_numeric_keys_in_object_array_casts
How common is this problem? It looks like an edge case of an edge case (converting objects to arrays as such is not a very frequent operation, and the reverse is even less frequent) but adds performance hit on the common case.
> I'm also not sure if this really ought to be an RFC, but I've received > little feedback so far, so it can't hurt.
This is a behavior change and a performance hit, so definitely yes, it should be RFC.
-- Stas Malyshev smalyshev@gmail.com

Andrew Faulds

9 years ago
Hi Stas, Stanislav Malyshev wrote:
> How common is this problem? It looks like an edge case of an edge case > (converting objects to arrays as such is not a very frequent operation, > and the reverse is even less frequent) but adds performance hit on the > common case.
The confusion of string key HashTables with so-called “symtables” (integer and non-numeric string key HashTables; probably a misnomer) crops up in a bunch of places. I think (object) and (array) is one of the more common ones, compared to say, ArrayObject properties and $GLOBALS. It does make the common case a little slower, it's true, but the the uncommon case is an important one. You should be able to use arbitrary string keys in an object or array, rather than having to work around PHP's brokenness here. I can imagine use cases where this might be a problem (one that comes to mind is JSON, whose Objects have two different representations in PHP which you may want to convert between). More generally, though, it's one less edge case to burden PHP developers with working around. We shouldn't expect people using PHP to work around bugs, we should fix them ourselves. In any case, it's only a small performance hit on an operation that takes a tiny (~10µs) amount of time anyway. As you said, it's an infrequent operation. I would be surprised if any application spends enough of its time converting objects to arrays or vice-versa to see any performance impact (though I am yet to test this).
> >> I'm also not sure if this really ought to be an RFC, but I've received >> little feedback so far, so it can't hurt. > > This is a behavior change and a performance hit, so definitely yes, it > should be RFC. >
Fair point. Thanks.
-- Andrea Faulds https://ajf.me/