Espacios de nombres de PHP en WordPress: una guía sensata

Publicado: 2018-10-16

Los espacios de nombres de PHP tienen casi diez años. Sí, ha pasado una década (y sí, te estás haciendo viejo). A pesar de que ha pasado una década desde que se lanzó PHP v5.3, muchos desarrolladores aún no tienen una comprensión básica de los espacios de nombres. A decir verdad, WordPress no usa espacios de nombres , por lo que " no necesita saber cómo usar espacios de nombres si solo trabaja con WordPress ". No es necesario que seas un ninja del espacio de nombres, pero comprender los conceptos básicos es simple y te hace bien.

Los espacios de nombres de PHP han existido durante una década, ¿y todavía no los usa porque #wordpress tampoco lo hace? ¡Léelos y comienza a usarlos en 2 minutos! #desarrollo

HAGA CLIC PARA TUITAR

Cuando no hay soporte de espacio de nombres, use un prefijo

Durante mucho, mucho tiempo, PHP no tuvo soporte de espacio de nombres nativo. Es por eso que WordPress y muchas otras grandes bases de código no usan espacios de nombres nativos. No estaban presentes cuando se necesitaban, por lo que se utilizan prefijos.

El espacio de nombres es importante porque se asegura de que su función write_to_log() no haya sido definida por otra pieza de código. Para evitar el conflicto de nombres, todo en el ámbito global necesita un prefijo, por lo que la función se convierte en awesome_project_write_to_log() y todas las demás funciones y variables también obtienen el prefijo awesome_project_ . ¿Sencillo? ¡Está! ¿Lindo? No exactamente.

Hay algunas alternativas a ese enfoque, como la encapsulación de métodos estáticos. Envuelves todas tus funciones en una clase y las declaras como métodos estáticos. Luego, en lugar de llamar a my_function() , llama a My_Class::my_function() . ¿Mejor? Un poco, pero aún no es un espacio de nombres adecuado.

Veamos cómo el espacio de nombres permite que múltiples piezas de código (o paquetes, si lo desea) usen los mismos nombres de clase y función sin conflicto. O como dice el manual de PHP, cómo habilitan la encapsulación de código. Su analogía con los archivos y las carpetas también es acertada: en muchos sentidos, los espacios de nombres se comportan como carpetas, así que copiaré y pegaré del manual;

En cualquier sistema operativo, los directorios sirven para agrupar archivos relacionados y actúan como un espacio de nombres para los archivos que contienen. Por ejemplo, el archivo foo.txt puede existir tanto en el directorio /home/greg como en /home/other, pero no pueden coexistir dos copias de foo.txt en el mismo directorio. Para acceder al archivo foo.txt fuera del directorio /home/greg, debemos anteponer el nombre completo del directorio al nombre del archivo usando el separador de directorio para obtener /home/greg/foo.txt.

Declarar espacios de nombres: recuerda la primera línea

El espacio de namespace de la palabra clave tiene que ser la primera línea de código en el archivo (sin contar los comentarios y cualquier contenido que no sea PHP). Los espacios de nombres afectan solo a clases, interfaces, funciones y constantes. No afectan a las variables. Puede definir el mismo espacio de nombres en varios archivos, lo que le permite dividir el código en varios archivos. Los subespacios de nombres permiten definir una jerarquía en los espacios de nombres como en las carpetas mediante el uso de una barra invertida: namespace myproject\level1\level2 . Esas son reglas básicas y casi todas para declarar espacios de nombres.

// file-A.php contains a function under the myCompany\PackageA namespace
namespace myCompany\PackageA;
 
function do_something() {
  // do things
}
// file-B.php contains a function with the same name
// but under a different namespace
namespace myCompany\PackageB;
 
function do_something() {
  // do things
}

Aunque es posible, recomiendo encarecidamente no combinar varios espacios de nombres en un solo archivo. Confía en mí, tarde o temprano olvidarás que lo hiciste y luego depurar un error de 2 minutos lleva dos horas. Sin embargo, si es necesario, aquí está la sintaxis.

// do not put multiple namespace declarations into the same file
// but if you must, here's the syntax

namespace MyFirstProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

namespace MySecondProject {
  const CONST = true;
  class Connection { /* ... */ }
  function connect() { /* ... */  }
}

// any code after this has to go in the global namespace
namespace {
  $some_var = 1;
  function_in_global_namespace();
}

Uso de espacios de nombres: recordar carpetas

Como ya dije, los espacios de nombres son extremadamente similares a las carpetas. Asumiendo que el archivo foo.txt está en su carpeta actual; puede hacer referencia a él con un simple foo.txt . Si está un nivel por encima de la carpeta con el archivo foo.txt , entonces necesita usar una ruta relativa ../foo.txt o una absoluta /folder1/folder2/foo.txt . Nada sofisticado. Los espacios de nombres utilizan el mismo paradigma.

// remember after declaring a namespace
// all our code is in it; like when you're working in a folder
namespace mycompany\project;

function foo() {}
class foo {
  static function staticmethod() {}
}

// resolves to mycompany\project\foo() because of line #3
foo();

// likewise, resolves to mycompany\project\foo::staticmethod()
foo::staticmethod();

// constant are affected by namespaces too
// so we're working with mycompany\project\FOO
echo FOO;

// this is a relative path
// resolves to mycompany\project\subnamespace\foo()
subnamespace\foo();

// static methods are no different
// mycompany\project\subnamespace\foo::staticmethod()
subnamespace\foo::staticmethod();
                                 
// a full namespace path starts with a backslash
// it resolves exactly to what it says it does
\otherNamespace\Bar\foo();

// again same thing for a constant, full path nothing magical
echo \otherNamespace\Bar\FOO;

Eche un vistazo a la palabra clave use en el manual de PHP; los ejemplos son geniales. Proporciona una forma de importar código de otros espacios de nombres de PHP al espacio de nombres actual o para hacer referencia a un nombre externo (totalmente calificado) con un alias.

Sí, necesita espacios de nombres y debe usarlos

Como es más que evidente al mirar la fuente de WordPress, no tiene que usar espacios de nombres, pero sí tiene que usar algún método de espacio de nombres. Prefijo con wp_ en el caso de WP. Entonces, si ya lo estamos haciendo, ¿por qué no hacerlo correctamente?

Los espacios de nombres en PHP se integran fácilmente en cualquier flujo de trabajo de desarrollo. Facilitan la carga automática, la denominación de archivos y, en general, hacen que el código sea más limpio. Refactorizar el código antiguo nunca es una tarea popular (independientemente del lenguaje de codificación), así que no voy a decirle que siga adelante y refactorice un proyecto funcional de 2 MB solo para que pueda decir que usa espacios de nombres. Sin embargo, voy a insistir en que use espacios de nombres cuando trabaje en nuevos proyectos. Te lo agradecerás muy pronto.

¡La documentación oficial de PHP sobre espacios de nombres es más que excelente! Los ejemplos de código son limpios y los comentarios son útiles en el mundo real. Asegúrese de examinarlo, incluso si cree que no es necesario.