Stanislav Malyshev wrote:
>> What happens if you mix them? 
>> <?php namespace baz;
>>
>> namespace foo {
>>   class Bar {
>>     ...
>>   }
>> }
>> ?>
> 
> That's not the fun yet. This is:
> 
> <?php
> namespace baz;
> 
> namespace foo { ...whatever... }
> 
> class bar {}
> 
> ?>

If by fun you mean "Fatal error: Namespace cannot be declared twice
(without brackets) or nested within brackets in ..."

To clarify, the patch works as follows:

when namespace baz; is encountered, CG(current_namespace) is set to a
non-NULL zstr (name->u.constant).  Later on, when you try to namespace
foo {}, this check fails:

        if (CG(current_namespace)) {
                zend_error(E_COMPILE_ERROR, "Namespace cannot be declared twice
(without brackets) or nested within brackets");
        }

In other words, if there is a current namespace present, you can't
declare another or redeclare.  This code also fails with the same
E_COMPILE_ERROR above (and is one of the new tests in the patch):

<?php
namespace baz;
namespace foo;

class bar {}
?>

> Now, is bar in namespace baz or not? I guess it is, otherwise it stops
> making any sense. So now when you see in the code it says "class bar"
> what do you do to know which namespace it is? Right, you go up to the
> code, counting closing and open brackets and hoping you didn't miss any
> and try to figure out if it's that main namespace or one of the other
> ones. Now next question - how ones in namespace foo are supposed to call
> class bar? They'd have to call it by full name, baz::bar, right? Welcome
> back, long names. But wait, we could use an import, right? So now we'd
> have block-local imports. And we'd have to track them per
> namespace-block. BTW, what about imports in baz - are they active in
> foo? What if baz wants to talk to class in foo - should it import it?
> And BTW - how the patch solves it - I didn't read all of it, but not
> sure it does it correctly.
> 
>> Would the compiler have a heart attack if someone did:
>>
>> <?php
>> namespace foo {
>>   namespace baz {
>>     class Bar { ... }
>>   }
>> }
>> ?>
> 
> This syntax implies that baz has access to names in foo. The separate
> syntax doesn't. But that's only part of the story - remember the
> names/imports story above? Now take that and make it unlimited depth
> stack, since you'd have to track everything on *each* nesting level
> separately. I wouldn't want to open this can of worms. That'd produce
> messy engine and messy code.

I don't want to open this can of worms either, and so I didn't. :)

Greg

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

Reply via email to