Namespaces in PHP

During Stefan Priebsch' session at the Dutch PHP Conference on PHP 5.3 and PHP 6 - A look ahead a discussion popped up about PHP's namespace support. One of the things that came up is the conflicts that can arise with internal classes.

Take for example this code:

<?php
use PEAR::Date::Interval as Interval;
?>

In PHP 5.3 this would alias the class Interval in the namespace PEAR::Date to the class Interval. For now, this code would work just fine. However, if PHP would introduce a class "Interval" at some point in the future (and PHP can do this as it owns the global namespace ) then the above code would suddenly stop working. So in order to use namespaces properly, you always need to have at least two elements left, like:

<?php
use PEAR::Date as pd;
$interval = new pd::Interval;
?>

You need to make sure of course that the short name that you pick is something that does not sound to much like a class name otherwise you'll have exactly the same issue. It's not very likely that PHP will introduce a class pd though.

Comments

In reply to mramirez: This is not a problem of "C style programming languages". The problem is that the C programmers know only the C++ namespace implementation. :)

This problem also exists in other C style programming languages. A potential solution, its to use a separate operator for classes and for namespaces, e.g. ¨MyNamespace!!Anything¨ and ¨MyClass::Anything¨

Dennis, that's because such things should not end up in comments in the manual. You should instead have brought it up on the php-internals mailing list.

I have raised this problem about 6 months ago in comments to this manual page http://php.net/manual/en/language.namespaces.rules.php

However, my comment was deleted! You can see that the only comment on that is referencing the deleted one.

And, finally, regarding this "workaround". It is not 100% safe, and as well as the inability of PHP5.3 to do "use some::namespace::*" will often result in more typing (compared to pear-like naming), as several bloggers have pointed out in the past.

Thanks for this Derick. Informative.

  • C

Hi,

It is important to note that with the current namespace design, this issue only occurs if your code is non-namespaced. The following code will continue to work ad infinitum:

The only case to worry about would be a user class named Interval in the namespace Date, but again this would be a problem no matter what, which is why when you choose a namespace prefix, it is wise to choose one that is not a common name (like PEAR2, for instance)

This is why I suggest that all code using namespaced code should pop a "namespace __user__;" at the top, and PHP reserve the __user__ namespace for top-level code.

Of course, there is a still some time to closely review the namespace implementation, as the gotchas are fierce if you don't properly import namespaced classnames with the "use" keyword. I highly suggest all smart people apply themselves to some of the harder problems raised, such as the order of resolution of unqualified names like "Interval" (::Date::Interval is a fully qualified name because it starts with ::)

and obscure naming conventions suddenly return.

sigh

I think we should extend the userland naming guide for 5.3 with a warning on this point.

Add Comment

Name:
Email:

Will not be posted
Comment:

Please follow the reStructured Text format


All comments are moderated

Life Line