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)
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
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();
}
?>
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)
<?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";
}
<?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();
}
If you have the habit to always use the closing PHP tag "?>" in your test files, remember that with the bracketed syntax code outside the brackets, including new lines outside the PHP tags, is not allowed. In particular, even though PHP sees a new line after the closing tag as a part of the line and eats it, some editors, such as Gedit, Gvim, Vim and Nano in Ubuntu, will add yet another new line after this new line and this will create an error.
//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";
}
?>
There are rational examples of where the ability to blend multiple namespaces into a single file is not only desirable but also absolutely necessary. An example of where this ability is useful is over in the very popular phpseclib library where they are PSR-4 compliant but, in order to be compliant, they have to read a directory of files to know what classes are available so that the autoloader can load the correct files. If they, instead, just bundled the defaults into one file using this mechanism already supported by PHP core, there would be no need to do extraneous scanning of the file system.
That's just one legitimate use-case where strict compliance with PSRs gets in the way of good software development.