In PHP, namespaces are designed to solve the Name collisions problem that multiple classes/functions have the same name between the code you create and the code other author create(For example: library).
A real-life example: there are two students called "Tom". We can separate them by the ClassRoom(space).
\ to access the related classes, interfaces, functions and constants with namespacesuse the keyword namespace to declare a namespace in PHP.
namespace must be the first statement in the script
// !! There can't be any characters or whitespace here
// Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script
<?php
// !! There can't be any statement here
namespace my\name; // see "Defining Namespaces" section
class MyClass {}
function myfunction() { echo "function";}
const MYCONST = 1;
alternatively, you use the alternate bracketed syntax.
<?php
namespace my\name{
class MyClass {}
function myfunction() { echo "function";}
const MYCONST = 1;
}
?>
my namespace's items.<?php include_once 'my.php'; $myclass = new \my\name\MyClass; // OR my\name\MyClass \my\name\myfunction(); echo \my\name\MYCONST;
Much like directories and files,
| Namespace name definitions | Example | resolves to (current namespace:curNS) |
resolves to (global) |
|---|---|---|---|
| Unqualified name, unprefixed class name |
$a = new foo(); foo::staticmethod(); |
curNS\foo | foo |
| Qualified name, prefixed class name |
$a = new subNS\foo(); subNS\foo::staticmethod(); |
curNS\subNS\foo | subNS\foo |
| Fully qualified name prefixed name with global prefix operator |
$a = new \curNS\foo(); \curNS\foo::staticmethod(); |
curNS\foo | curNS\foo |
| Referred Way | Example | resolve to | Example(/home/foo) |
|---|---|---|---|
| Relative file name | foo.txt | currentdirectory/foo.txt | /home/foo/foo.txt |
| Relative path name | subdirectory/foo.txt | currentdirectory/subdirectory/foo.txt | /home/foo/subdirectory/foo.txt |
| Absolute path name | /main/foo.txt | /main/foo.txt | /main/foo.txt |
Without any namespace definition, all class and function definitions are placed into the global space.
namespace and constant __NAMESPACE__PHP supports two ways of abstractly accessing elements within the current namespace, the __NAMESPACE__ magic constant, and the namespace keyword.
__NAMESPACE__ magic constant contains the current namespace name( In global code, it contains an empty string )<?php namespace MyProject; echo '"', __NAMESPACE__, '"'; // "MyProject" ?>
<?php echo '"', __NAMESPACE__, '"'; // "" ?>
sub\functions.php
<?php
namespace Lautturi\sub;
function func(){
echo "function in Lautturi space <br>";
}
?>
sub\cname.php
<?php
namespace Lautturi\sub;
class cname{
}
?>
myproject.php
<?php
namespace Lautturi;
include_once 'sub\function.php';
include_once 'sub\cname.php';
const MYCONST = "Lautturi";
function func(){
echo "function in Lautturi space <br>";
}
namespace\func(); // calls function Lautturi\func()
namespace\sub\func(); // calls function Lautturi\sub\func()
namespace\cname::method(); // calls static method "method" of class Lautturi\cname
$subCname = new namespace\sub\cname(); // instantiates object of class Lautturi\sub\cname
echo namespace\MYCONST; // get value of constant Lautturi\MYCONST
?>
It is recommended to map namespaces with the directories and files.
Each class file only define one class.The file name is the same name as the class name.
Assume we have the project in the folder /var/www/project
project/
|---index.php
|---lib/ (or vender)
|---Lau/
|---BaseLau.php (namespace lau;class BaseLau{})
|---web/
|---App.php (namespace lau\web;class App{})
|---XXSoft/ (vender name)
|---Helper.php (namespace xxsoft;class Helper{})
project/lib/Lau/BaseLau.php
<?php
namespace lau;
class BaseLau {
public static function getVersion()
{
return '1.0.9';
}
}
project/lib/XXSoft/helper.php
<?php
namespace xxsoft;
class Helper{
public function help()
{
return "helper function";
}
}
project/lib/Lau/web/App.php
<?php
namespace lau\web;
class App{
public function hello()
{
echo \lau::getVersion();
echo \xxsoft::help();
echo "Hello Lautturi";
}
}
project/index.php
<?php
namespace lau\web;
class App{
public function hello()
{
echo \lau\BaseLau::getVersion();
$helper = new \xxsoft\Helper;
echo $helper->help();
echo "Hello Lautturi";
}
}
use keywordIn PHP, aliasing is accomplished with the use operator. It will import a class to the current scope.
\) is unnecessary and not recommended.<?php use lau\BaseLau; // same as but not recommended -> use \lau\BaseLau use lau\BaseLau as Another $baselau = new BaseLau(); $another = new Another(); // Fully qualified names are unaffected by imports $obj = new Another; // instantiates object of class lau\BaseLau $obj = new \Another; // instantiates object of class Another $obj = new Another\thing; // instantiates object of class lau\BaseLau\thing $obj = new \Another\thing; // instantiates object of class Another\thing
<?php namespace foo; use My\Full\Classname as Another; // this is the same as use My\Full\NSname as NSname use My\Full\NSname; // importing a global class use ArrayObject; // importing a function (PHP 5.6+) use function My\Full\functionName; // aliasing a function (PHP 5.6+) use function My\Full\functionName as func; // importing a constant (PHP 5.6+) use const My\Full\CONSTANT; $obj = new namespace\Another; // instantiates object of class foo\Another $obj = new Another; // instantiates object of class My\Full\Classname NSname\subns\func(); // calls function My\Full\NSname\subns\func $a = new ArrayObject(array(1)); // instantiates object of class ArrayObject // without the "use ArrayObject" we would instantiate an object of class foo\ArrayObject func(); // calls function My\Full\functionName echo CONSTANT; // echoes the value of My\Full\CONSTANT ?>
project/lib/Lau/BaseLau.php
<?php
namespace lau;
class BaseLau {
public static function getVersion()
{
return '1.0.9';
}
}
project/lib/XXSoft/helper.php
<?php
namespace xxsoft;
class Helper{
public function help()
{
return "helper function";
}
}
project/lib/Lau/web/App.php
<?php
namespace lau\web;
use lau\BaseLau;
use xxsoft\Helper;
class App{
public function hello()
{
echo BaseLau::getVersion();
$helper = new Helper();
echo $helper->help();
echo "Hello Lautturi";
}
}
project/index.php
<?php include_once 'lib/Lau/BaseLau.php'; include_once 'lib/Lau/web/App.php'; include_once 'lib/XXSoft/helper.php'; use Lau\web\App; $app = new App(); $app -> hello(); ?>