Forum PHP 2017

Namespaces overview

What are namespaces? In the broadest definition namespaces are a way of encapsulating items. This can be seen as an abstract concept in many places. For example, in any operating system directories serve to group related files, and act as a namespace for the files within them. As a concrete example, the file foo.txt can exist in both directory /home/greg and in /home/other, but two copies of foo.txt cannot co-exist in the same directory. In addition, to access the foo.txt file outside of the /home/greg directory, we must prepend the directory name to the file name using the directory separator to get /home/greg/foo.txt. This same principle extends to namespaces in the programming world.

In the PHP world, namespaces are designed to solve two problems that authors of libraries and applications encounter when creating re-usable code elements such as classes or functions:

  1. Name collisions between code you create, and internal PHP classes/functions/constants or third-party classes/functions/constants.
  2. Ability to alias (or shorten) Extra_Long_Names designed to alleviate the first problem, improving readability of source code.

PHP Namespaces provide a way in which to group related classes, functions and constants. Here is an example of namespace syntax in PHP:

Example #1 Namespace syntax example

namespace my\name// see "Defining Namespaces" section

class MyClass {}
myfunction() {}

$a = new MyClass;
$c = new \my\name\MyClass// see "Global Space" section

$a strlen('hi'); // see "Using namespaces: fallback to global
                   // function/constant" section

$d = namespace\MYCONST// see "namespace operator and __NAMESPACE__
                        // constant" section
constant($d); // see "Namespaces and dynamic language features" section

Namespaces are available in PHP as of PHP 5.3.0.

add a note add a note

User Contributed Notes 6 notes

6 years ago
Thought this might help other newbies like me...

Name collisions means:
you create a function named db_connect, and somebody elses code that you use in your file (i.e. an include) has the same function with the same name.

To get around that problem, you rename your function SteveWa_db_connect  which makes your code longer and harder to read.

Now you can use namespaces to keep your function name separate from anyone else's function name, and you won't have to make extra_long_named functions to get around the name collision problem.

So a namespace is like a pointer to a file path where you can find the source of the function you are working with
vlad dot 32418 at gmail dot com
3 months ago
I was not obvious for me...
You can't resolve variable names conflict via namespaces.


namespace myspace {
   $line = "some text";
   function someFunc() { }

If you attach this file:


You should call the function this way:


But echo $line; would give you "some text".
(echo myspace\$line; would give you an error).
Dmitry Snytkine
6 years ago
Just a note: namespace (even nested or sub-namespace) cannot be just a number, it must start with a letter.
For example, lets say you want to use namespace for versioning of your packages or versioning of your API:

namespace Mynamespace\1;  // Illegal
Instead use this:
namespace Mynamespace\v1; // OK
pierstoval at gmail dot com
2 years ago
To people coming here by searching about namespaces, know that a consortium has studied about best practices in PHP, in order to allow developers to have common coding standards.

These best practices are called "PHP Standard Recommendations" , also known as PSR.

They are visible on this link :

Actually there are 5 coding standards categories :
PSR-0 : Autoloading Standard , which goal is to make the use of Namespaces easier, in order to convert a namespace into a file path.
PSR-1 : Basic Coding Standard , basically, standards :)
PSR-2 : Coding Style Guide, where to put braces, how to write a class, etc.
PSR-3 : Logger Interface , how to write a standard logger
PSR-4 : Improved Autoloading , to resolve more Namespaces into paths.

The ones I want to point are PSR-0 and PSR-4 : they use namespaces to resolve a FQCN (Fully qualified class name = full namespace + class name) into a file path.
Basic example, you have this directory structure :

The namespacing PSR-0 or PSR-4 standard tells that you can transform this path into a FQCN.
Read the principles of autoload if you need to know what it means, because it's almost mandatory ;) .

Structure :

Files :

// {path}/index.php
include 'autoloader.php';
$tool = new Pierstoval/Tools/MyTool();

// {path}/src/Pierstoval/Tools/MyTool.php
namespace Pierstoval\Tools;
MyTool {}

// {path}/autoloader.php
function loadClass($className) {
$fileName = '';
$namespace = '';

// Sets the include path as the "src" directory
$includePath = dirname(__FILE__).DIRECTORY_SEPARATOR.'src';

        if (
false !== ($lastNsPos = strripos($className, '\\'))) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
$fullFileName = $includePath . DIRECTORY_SEPARATOR . $fileName;
        if (
file_exists($fullFileName)) {
        } else {
'Class "'.$className.'" does not exist.';
spl_autoload_register('loadClass'); // Registers the autoloader

A standardized autoloader will get the class you want to instanciate (MyTool) and get the FQCN, transform it into a file path, and check if the file exists. If it does, it will <?php include(); ?> it, and if you wrote your class correctly, the class will be available within its correct namespace.
Then, if you have the following code :
<?php $tool = new Pierstoval/Tools/MyTool(); ?>
The autoloader will transform the FQCN into this path :

This might be the best practices ever in PHP framework developments, such as Symfony or others.
php dot net at e-z dot name
3 years ago
php namespaces are case-insensitive:

namespace foo;

'from bar';



\bar() // output: from bar

sonkengmaldini at gmail dot com
1 year ago
Be aware that using  character set UTF-8 with namespace will output a fatal error telling you that 'Namespace declaration statement has to be the very first statement in the script ' instead of that character use the UTF-8 (sans BOM) !
this will display the previous message
namespace myNameSpace;//fatal error! with UTF-8 character set
To Top