Introducción a los espacios de nombres
(PHP 5 >= 5.3.0, PHP 7, PHP 8)
¿Qué son los espacios de nombres? En su definición más amplia, representan
un medio para encapsular elementos. Esto puede concebirse como un concepto
abstracto, por varias razones. Por ejemplo, en un sistema de archivos, los
directorios representan un grupo de archivos asociados y sirven como espacio de nombres
para los archivos que contienen. Un ejemplo concreto es que el archivo
foo.txt
puede existir en ambos directorios
/home/greg
y /home/other
, pero que
las dos copias de foo.txt
no pueden coexistir
en el mismo directorio. Además, para acceder al archivo foo.txt
desde fuera del directorio /home/greg
, es necesario especificar
el nombre del directorio utilizando un separador de directorios, como
/home/greg/foo.txt
. El mismo principio se aplica a los
espacios de nombres en el mundo de la programación.
En el mundo de PHP, los espacios de nombres están diseñados para resolver dos problemas
que enfrentan los autores de bibliotecas y aplicaciones al reutilizar elementos
como clases o bibliotecas de funciones:
-
Colisiones de nombres entre el código que se crea, las clases, funciones
o constantes internas de PHP, o las de bibliotecas de terceros.
-
La capacidad de crear alias o acortar nombres como Nombres_Extremadamente_Largos
para ayudar a resolver el primer problema y mejorar la legibilidad
del código.
Los espacios de nombres de PHP proporcionan un medio para agrupar clases, interfaces,
funciones o constantes. Aquí hay un ejemplo de sintaxis de los espacios de nombres de PHP:
Ejemplo #1 Ejemplo de sintaxis de espacios de nombres
<?php
namespace mon\nom; // Ver la sección "Definición de espacios de nombres"
class MaClasse {}
function mafonction() {}
const MACONSTANTE = 1;
$a = new MaClasse;
$c = new \mon\nom\MaClasse; // Ver la sección "Espacio global"
$a = strlen('bonjour'); // Ver "Uso de espacios de nombres: retorno al espacio global
$d = namespace\MACONSTANTE; // Ver "El operador namespace y la constante __NAMESPACE__
$d = __NAMESPACE__ . '\MACONSTANTE';
echo constant($d); // Ver "Espacios de nombres y características dinámicas"
?>
Nota:
Los nombres de espacios de nombres no son sensibles a mayúsculas/minúsculas.
Nota:
Los espacios de nombres PHP
, así como los nombres compuestos
que comienzan con estos nombres (como PHP\Classes
)
están reservados para el uso interno del lenguaje y no deben usarse
en el código del espacio de usuario.
SteveWa ¶14 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
Dmitry Snytkine ¶14 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 ¶10 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 : http://www.php-fig.org/psr
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 :
./src/Pierstoval/Tools/MyTool.php
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 :
{path}/autoloader.php
{path}/index.php
{path}/src/Pierstoval/Tools/MyTool.php
Files :
<?php
include 'autoloader.php';
$tool = new Pierstoval/Tools/MyTool();
?>
<?php
namespace Pierstoval\Tools;
class MyTool {}
?>
<?php
function loadClass($className) {
$fileName = '';
$namespace = '';
$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)) {
require $fullFileName;
} else {
echo 'Class "'.$className.'" does not exist.';
}
}
spl_autoload_register('loadClass'); ?>
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 :
{path}/src/Pierstoval/Tools/MyTool.php
This might be the best practices ever in PHP framework developments, such as Symfony or others.
shewa12kpi at gmail dot com ¶4 years ago
<?php
namespace Mobile;
class User
{
public $name = 'mobile user';
}
$user = new \Mobile\User;
echo $user->name;
namespace TV ;
class User
{
public static $name = 'tv user';
}
echo \TV\User::$name;