Hi, folks:
Recently I have been trying to fix bugs on bugs.php.net. I've been looking at
the bug: https://bugs.php.net/bug.php?id=61655.
for short: after convert a stdClass with a property with number name to array
can't be access anymore.
after some code searching, I found that. class property lookup differs from
array's. when convert the
internal HashTable won't be touched. class property always lookup by string,
but array will try to handle
numeric(@see Zend/zend_hash.h:307 ZEND_HANDLE_NUMERIC macro).
I don't know whether this has been discussed before, if so forgive me please.
now PHP allow to access property with this syntax: $obj->{$expr} $expr can be
anything. PHP
didn't try to validate whether it is a valid label or not. the only problem is
we can't access it directly
like: $expr = '007gun'; $obj->{$expr} = 10; echo $obj->007gun; It's not a big
problem, we can still access
it with the same syntax. but after convert to array, we got problem.
On the contrary array to object conversion have the same problem:
<?php
$ar = array(0 => "value", "000invlidlabel" => "2", key" => "value2");
$obj = (object)$ar;
$obj->0 will never be accessible, "000invilidlabel" can be access, but can't
use normal property access syntax.
I know PHP make use of HashTable a lot, maybe because of performance concern or
historical reason.
but we always want to be better.
In my opinion:
1. I see no reason why user will set an invalid label as property name. because
It can be access with $obj->{$expr} only or sometime can never been accessed.
2. for the same reason array to object should at least let developer know
something they may not want to happen did happened.
so I make some change:
1. set a property name should be valid label(__set magic method also follow it)
2. raise warning and move invlid property names to a special property when
convert a array contains invlid key name to stdClass.
I just want to make things more consist, or maybe we just make sure numeric
keys works consist since php is so flexible.
Any thoughts?
BTW: I sent bugfix for bug#61347 ArrayIterator misrewind and gives misleading
notice when manipulating empty/moved to end array
https://github.com/php/php-src/pull/38 thanks @nikic & @cataphract's great
suggestions, will someone take a look, do I still have to improve it?
Thank you!
--
reeze | reeze.cn
--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php