## FAQ: things you need to know about namespaces

(PHP 5 >= 5.3.0)

This FAQ is split into two sections: common questions, and some specifics of implementation that are helpful to understand fully.

First, the common questions.

There are a few implementation details of the namespace implementations that are helpful to understand.

### If I don't use namespaces, should I care about any of this?

No. Namespaces do not affect any existing code in any way, or any as-yet-to-be-written code that does not contain namespaces. You can write this code if you wish:

Example #1 Accessing global classes outside a namespace

 <?php$a = new \ stdClass ;  This is functionally equivalent to: Example #2 Accessing global classes outside a namespace  <?php$a  = new  stdClass ;

### How do I use internal or global classes in a namespace?

Example #3 Accessing internal classes in namespaces

### How does a name like my\name resolve?

Names that contain a backslash but do not begin with a backslash like my\name can be resolved in 2 different ways.

If there is an import statement that aliases another name to my, then the import alias is applied to the my in my\name.

Otherwise, the current namespace name is prepended to my\name.

Example #6 Qualified names

### How does an unqualified function name or unqualified constant name like name resolve?

Function or constant names that do not contain a backslash like name can be resolved in 2 different ways.

First, the current namespace name is prepended to name.

Finally, if the constant or function name does not exist in the current namespace, a global constant or function name is used if it exists.

Example #8 Unqualified function or constant names

 <?php namespace  foo ;use  blah \ blah  as  foo ; const  FOO  =  1 ; function  my () {}function  foo () {}function  sort (& $a ){ sort ($a );     $a = array_flip ($a );    return  $a ;} my (); // calls "foo\my"$a  =  strlen ( 'hi' );  // calls global function "strlen" because "foo\strlen" does not exist $arr = array( 1 , 3 , 2 );$b  =  sort ( $arr ); // calls function "foo\sort"$c  =  foo ();  // calls function "foo\foo" - import is not applied $a = FOO ; // sets$a to value of constant "foo\FOO" - import is not applied $b = INI_ALL ; // sets$b to value of global constant "INI_ALL" ?>

### Import names cannot conflict with classes defined in the same file.

The following script combinations are legal:

file1.php

 <?php namespace  my \ stuff ;class  MyClass  {} ?>

another.php

 <?php namespace  another ;class  thing  {} ?>

file2.php

 <?php namespace  my \ stuff ;include  'file1.php' ;include  'another.php' ; use  another \ thing  as  MyClass ; $a = new MyClass ; // instantiates class "thing" from namespace another ?>  There is no name conflict, even though the class MyClass exists within the my\stuff namespace, because the MyClass definition is in a separate file. However, the next example causes a fatal error on name conflict because MyClass is defined in the same file as the use statement.  <?php namespace my \ stuff ;use another \ thing as MyClass ;class MyClass {} // fatal error: MyClass conflicts with import statement$a  = new  MyClass ; ?>

### Nested namespaces are not allowed.

PHP does not allow nesting namespaces

 <?php namespace  my \ stuff  {    namespace  nested  {        class  foo  {}    }} ?>
However, it is easy to simulate nested namespaces like so:
 <?php namespace  my \ stuff \ nested  {    class  foo  {}} ?>

### Neither functions nor constants can be imported via the use statement.

The only elements that are affected by use statements are namespaces and class names. In order to shorten a long constant or function, import its containing namespace

### Cannot override special constants NULL, TRUE, FALSE, ZEND_THREAD_SAFE or ZEND_DEBUG_BUILD

Any attempt to define a namespaced constant that is a special, built-in constant results in a fatal error

Example #11 Undefined constants

 <?php namespace  bar ;const  NULL  =  0 ;  // fatal error; const  true  =  'stupid' ;  // also fatal error;// etc. ?>

• TOP