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

Reply via email to