Gregory Beaver wrote:
> Rasmus Lerdorf wrote:
>> Sheez, guys, slow down a tad.  Just because he says "no performance
>> penalty" in the description, doesn't make it true.  Unless I missed
>> something in the patch, I don't see how I would resolve the symbols at
>> compile-time now which means it has been moved to the executor and in
>> doing so it implies a huge performance penalty.
> 
> Hi Rasmus,
> 
> I'm actually certain that the patch doesn't change any of the symbol
> resolution logic or add any need to move things from the compile-time to
> the executor.  This is because the namespace implementation basically
> works more like a #define macro to auto-prepend class names and function
> names with namespace names.
> 
> Old logic:
> 
> request start => CG(namespace) = NULL
> T_NAMESPACE ...;
> zend_do_namespace() => defines CG(namespace) which is used for creating
> class and function entries
> php junk
> compile end => if (CG(namespace)) destruct CG(namespace), CG(namespace)
> = NULL
> 
> New logic:
> 
> request start => CG(namespace) = NULL
> [potential php junk]
> T_NAMESPACE ... {
> zend_do_namespace() => defines CG(namespace) which is used for creating
> class and function entries
> php junk
> }
> zend_do_end_namespace() => destruct CG(namespace), CG(namespace) = NULL
> php junk (which can include class/function entries, although that's a
> terrible idea)
> T_NAMESPACE ... {
> zend_do_namespace() => defines CG(namespace) which is used for creating
> class and function entries
> php junk
> }
> zend_do_end_namespace() => destruct CG(namespace), CG(namespace) = NULL
> compile end => if (CG(namespace)) destruct CG(namespace), CG(namespace)
> = NULL
> 
> In other words, the only difference is that mid-parse the namespace
> #define-like prefix can be modified or removed.

Right, which breaks the single-namespace per file rule.  Opcode caches
work on a per-file basis, so I know for a single op_array that I will
never have to worry about a secondary namespace lookup because I know up
front which namespace I am in.  By allowing multiple namespaces per file
I have to keep checking or do some other clever trick to figure it out.

And nested namespaces really make a mess of this if something like this
is allowed:

foo.inc:
namespace A {
  include 'bar.inc';
}


bar.inc:
namespace B {
  ...
}

In this case bar.inc's functions will either be A::B::func() or
B::func() depending on how it is included which again means I can't do
any compile-time optimization.

-Rasmus

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

Reply via email to