Hello all,

May I suggest something in this area?
I hope it will resolve some problems related to namespaces and classes 
ambiguity.

Let's first take a look at the classes.
In-general they represent two things: scope and data.
Scope is a thing that can't be changed without compiler efforts and contains 
methods and constants. We access these things using :: separator.
2nd thing that I called data obviously contains class instance data that we 
know under property name. We can change data during runtime and we do it 
using executor. To access data we normally use -> separator. At this point 
somebody may want to point me out to the methods (the scope!) accessed 
with -> too. That's correct. But in this case we always mean $this or 
$variable that points to the Data, where executor will find pointer to the 
scope and will access it internally.

>From this perspective, namespace is nothing more but another layer of 
scopes. Indeed, it's supposed to contain all things like classes, functions, 
and even variables. If we make namespaces as power as this, they will be 
useful in complicated situations when for example you need to work with a 
3rd party framework that is full of classes, functions, and global variables 
with _the_same_ names as the ones you use in your own project. So you need a 
way to _isolate_ the framework and you need to do it _without_ any 
modifications in its code or you will have maintain your own changes in the 
foreign code each time the code is changed. With appropriately powerful 
namespaces, its just matter of moving all the framework objects (I mean 
classes, defines, functions, and global variables) into namespace. It comes 
with its own namespaces? Not a problem (see below).

I suggest to remove class table and introduce scope table. This table will 
contain classes and namespaces.
Technically speaking, with this approach namespace may contain other 
namespaces, classes, variables, defines, and functions. To access scope's 
item you still use :: separator. It's not that hard to access items at any 
level without even knowing you access class's scope or namespace's. It does 
not really matter! You only need to know names of the scopes and their 
relationship.
There is always current scope, which is "global" or noname namespace by 
default. It's created before any other items such as embedded functions or 
classes are created.  If you have thing1::thing2 in your code, executor 
should first lookup current scope for thing1 and if not found, lookup in the 
global namespace (unless current is global). You see, it does not really 
matter if thing1 is a class or namespace. It's just a scope name to lookup 
for and once namespaces and classes are all in one hash, it's quite trivial 
to do.

Include, require and their "_once" brothers, should include the file and 
make all its objects (like classes, functions, global variables) to be 
created in the current namespace. So the isolation will be achieved easily, 
you simply put include into a namespace and all the rest, including nested 
includes, will put all thing into the namespace.
namespace isolated_space {
include "3rdpartyframework/library.inc";
}

There is one more difference between namespaces and classes. You can span a 
namespace across multiple files and have multiple chunks of the same 
namespace in one.
With "include" sample above, to access functions or classes, we'll use 
either way:

1. reopen namespace and make call from it:
namespace isolated_space {
   afuntioncall();
}

2. specify the namespace explicitly:
isolated_space::afunctioncall();

In both cases, current namespace will be swithched to isolated_space and all 
things accessed by afunctioncall() will be looked up for in this namespace 
first.

Think about namespaces like directories in the filesystem. You can specify 
relative and absolute path. All other items like files, symlinks, devices, 
etc have to exist in directories.

-jv



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

Reply via email to