Hey:

On Sun, Nov 22, 2015 at 6:47 AM, Anthony Ferrara <ircmax...@gmail.com>
wrote:

> All,
>
> It appears that in our efforts to optimize PHP 7 we've introduced an
> inconsistency into array handling. This is demonstrated by this
> script: https://3v4l.org/hVcAB
>
> $a = 1;
> unset($a);
> var_dump(count($GLOBALS), $GLOBALS);
>
> The result is that the count doesn't match the contents of the array.
>
> It also affects objects casted to arrays in certain cases.
>
> Here, the array has 1 element, but should have 0. Trying to access the
> "1" element "a" results in a notice.
>
> This means that the count is incorrect. This is due to the fact that
> the "a" element follows an IS_INDIRECT type pointing to the other
> symbol table.
>
> A potential solution would be to make count() an O(n) operation in the
> case that the hashtable is a symbol table or if it has INDIRECT
> elements. Meaning that we'd compute the real count at runtime.
>
> This obviously has performance ramifications, but we shouldn't
> sacrifice consistency and behavior for performance IMHO. Especially
> when it comes to core data structures.
>
> I think this is significant enough to be a blocker to gold and that we
> should fix it prior to release.
>

I don't think so, it's only affects symbol tables. means, it won't affects
normal arrays. like:

<?php

$array = range(1, 10);
unset($array[2]);
var_dump(count($array));


$array = array("foo" => 1, "bar" => 2, "dummy" => 3);
unset($array["bar"]);
var_dump(count($array));
?>

anyway, I've fixed this here:
https://github.com/php/php-src/commit/eada2aa91add2de69bc5783b840a21243a7b0678

and, we maybe move this new functions  into zend_hash(as a ZEND_API),
anyway I am not sure whether it's okey for PHP-7.0.

will discuss with welting and Dmitry on Monday.

thanks

>
> Thoughts?


> Anthony
>
> --
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
>



-- 
Xinchen Hui
@Laruence
http://www.laruence.com/

Reply via email to