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