International PHP Conference 2015

Définition de plusieurs espaces de noms dans le même fichier

(PHP 5 >= 5.3.0)

Plusieurs espaces de noms peuvent aussi être déclarés dans le même fichier. Il y a deux syntaxes autorisées.

Exemple #1 Déclaration de plusieurs espaces de noms, syntaxe à combinaison simple

<?php
namespace MonProjet;

const 
CONNEXION_OK 1;
class 
Connexion /* ... */ }
function 
connecte() { /* ... */  }

namespace 
AutreProjet;

const 
CONNEXION_OK 1;
class 
Connexion /* ... */ }
function 
connecte() { /* ... */  }
?>

Cette syntaxe n'est pas recommandée pour combiner des espaces de noms dans un seul fichier. Au lieu de cela, il est recommandé d'utiliser la syntaxe à accolades.

Exemple #2 Déclaration de plusieurs espaces de noms, syntaxe à accolades

<?php
namespace MonProjet {

const 
CONNEXION_OK 1;
class 
Connexion /* ... */ }
function 
connecte() { /* ... */  }
}

namespace 
AutreProjet {

const 
CONNEXION_OK 1;
class 
Connexion /* ... */ }
function 
connecte() { /* ... */  }
}
?>

Il est fortement recommandé, en tant que pratique de codage, de ne pas mélanger plusieurs espaces de noms dans le même fichier. L'utilisation recommandée est de combiner plusieurs scripts PHP dans le même fichier.

Pour combiner plusieurs codes sans espaces de noms dans du code avec espace de noms, seule la syntaxe à accolades est supportée. Le code global doit être encadré par un espace de noms sans nom, tel que celui-ci :

Exemple #3 Déclaration de plusieurs espaces de noms avec un espace sans nom

<?php
namespace MonProjet {

const 
CONNEXION_OK 1;
class 
Connexion /* ... */ }
function 
connecte() { /* ... */  }
}

namespace { 
// code global
session_start();
$a MonProjet\connecte();
echo 
MonProjet\Connexion::start();
}
?>

Aucun code PHP ne peut exister hors des accolades de l'espace de noms, sauf pour ouvrir une nouvelle instruction declare.

Exemple #4 Déclaration de plusieurs espaces de noms avec un espace sans nom (2)

<?php
declare(encoding='UTF-8');
namespace 
MonProjet {

const 
CONNEXION_OK 1;
class 
Connexion /* ... */ }
function 
connecte() { /* ... */  }
}

namespace { 
// code global
session_start();
$a MonProjet\connecte();
echo 
MonProjet\Connexion::start();
}
?>

add a note add a note

User Contributed Notes 7 notes

up
6
Rahul Sonar
6 months ago
<?php
//Namespace can be used in this way also
namespace MyProject {

function
connect() { echo "ONE";  }
   
Sub\Level\connect();
}

namespace
MyProject\Sub {
   
function
connect() { echo "TWO";  }
   
Level\connect();
}

namespace
MyProject\Sub\Level {
   
    function
connect() { echo "THREE";  }   
    \
MyProject\Sub\Level\connect(); // OR we can use this as below
   
connect();
}
up
52
kothnok at gmail dot com
3 years ago
"use" statements are required to be placed after the "namespace my\space" but before the "{".
e.g.

<?php
namespace foo\bar;
use
my\space\MyClass;
{

// place code here

} // end of namespace foo\bar

namespace another\bar;
use
my\space\MyClass;
use
my\space\AnotherClass;
{

// place code here

} // end of namespace another\bar
?>
up
24
leaksin [ at ] gmail [ dot ] com
2 years ago
using of global namespaces and multiple namespaces in one PHP file increase the complexity and decrease readability of the code.
Let's try not use this scheme even it's very necessary (although there is not)
up
2
jigar dot vy at gmail dot com
2 months ago
<?php

// You cannot mix bracketed namespace declarations with unbracketed namespace declarations - will result in a Fatal error

namespace a;

echo
"I belong to namespace a";

namespace
b {
    echo
"I'm from namespace b";
}
up
1
Ishan Fernando
2 months ago
//call same named function using namespace

//food.php

<?php
namespace Food;

require (
'Apple.php');
require(
'Orange.php');

use
Apples;
use
Oranges;

 
Apples\eat();
 
Oranges\eat();
?>

//Apple.php
<?php
namespace Apples;

function
eat()
{
  echo
"eat apple";
}
?>

//Orange.php
<?php
namespace Oranges;

function
eat()
{
  echo
"eat Orange";
}
?>
up
0
Luis Pessoa
4 months ago
Be careful with include combined to namespaces:

file b.php
<?php
   
const WHERE_I_AM = 'I am in B';
   
    function
i_am_in() {
        \
A\cr_echo(WHERE_I_AM);
    }
?>

file c.php
<?php
   
namespace C {
        const
WHERE_I_AM = 'I am in C';
       
        function
i_am_in() {
            \
A\cr_echo(WHERE_I_AM);
        }
    }
?>

main file

<?php
  
   
namespace A {
   
        const
CR = "\r\n";
        const
WHERE_I_AM = 'I am in A';
       
        function
cr_echo($msg) {
            echo
$msg . CR;
        }
       
        function
i_am_in() {
           
cr_echo(WHERE_I_AM);
        }
    }
   
    namespace
B {
        require
'b.php';
    }
   
    namespace {
        require
'c.php';
       
        \
A\i_am_in(); //ok
       
\B\i_am_in(); // fatal-error
       
\C\i_am_in(); //ok
   
}
?>
up
-96
1932 at bk dot ru
1 year ago
last two examples give:

Fatal error: Call to undefined method MyProject\Connection::start() in Z:\home\test1.ru\www\link.php on line 12
To Top