> Atm it isn't possible to use a construct like $var = ${'_GET'}; inside a
> function or method. Will this behaviour change in future versions of
> PHP? I think it is somehow odd and inconsistent to not be able to use
> the superglobals that way, while it is possible outside of functions and
> methods and also with any other variable, e.g. the $HTTP_*_VARS.
> Imo it's an unnecessary restriction and will keep ppl using the old
> $HTTP_*_VARS. I also see no reason for it to stay that way and i think
> it wasn't intended by you, the developers, in the first place but turned
> out to work that way afterwards.
> So I really hope it'll change, would make much more sense. What do you
> think?
>
It comes down to how autoglobals are resolved.

When a script containg $_GET is parsed, ZE says "Oh, _GET is a registered
autoglobal, I'll flag that for fetching from the global symbol table".
Important factoid here:  The target hashtable is resolved at compile time.

All other variable lookups (not entirely true, but run with me here) are
resolved at run-time roughly thus:

Check (hashtable) for (expression)

In the case of $foo these break down as:

Check (active_symbol_table) for ('foo' index)

In the case of $bar['foo'] they become:
Check (Check (active_symbole_table) for ('bar' index')) for ('foo' index)

So in order for ZE to resolve the autoglobals correctly during runtime it
has to ask two questions for every *part* of every variable resolution: "Are
we checking against the active symbol table?  Is the index we're looking for
in the autoglobal registry?"  If so, replace active_symbol_table with the
global symbol_table, otherwise do the lookup as normal.

Putting this extra bundle of steps completely negates the speed-benefit of
resolving autoglobals at compile time.

Given that, I certainly wouldn't hold my breath waiting for that
functionality to change.

-Sara

P.S. - This is why:

$a['b']['c']['d']['e']['f'][] = 1;
$a['b']['c']['d']['e']['f'][] = 2;
$a['b']['c']['d']['e']['f'][] = 3;
$a['b']['c']['d']['e']['f'][] = 4;

is slower than:

$b =  &$a['b']['c']['d']['e']['f'];
$b[] = 1;
$b[] = 2;
$b[] = 3;
$b[] = 4;

Since in the first example the engine is doing 24 hash table lookups as
opposed to 11 in the second example.

And yes, $a['b']['c']['d']['e']['f'] = range(1,4); would be even faster....
it's called an example :p

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

Reply via email to