¬ŅQu√© son los namespaces de PHP?
Qué son los namespaces

¬ŅQu√© son los namespaces?‚Äč

Es a partir de la versi√≥n 5.3 de PHP se introdujo el concepto de namespace. Y se muestra una manera de encapsular los elementos.

Para comprender esta definición usaremos el siguiente ejemplo, en cualquier sistema operativo, los directorios sirven para agrupar archivos relacionados, actuando así como espacios de nombres para los archivos que contienen.

Como ejemplo, el archivo factor.php puede existir en los directorios /home/php y /home/comp, pero no pueden existir dos copias de factor.php en el mismo directorio. Adem√°s, para acceder al archivo factor.php fuera del directorio /home/php, se debe anteponer el nombre del directorio al nombre del archivo, empleando el separador de directorios para as√≠ obtener /home/php/factor.php. 

Este mismo principio se extiende a los namespaces en el mundo de la programación.

Es resumen, preguntandonos ¬ŅQu√© son los namespaces?, √©stos nos van a permitir una mejor organizaci√≥n de nuestro c√≥digo y adem√°s evitar√°n posibles colisiones con clases y m√©todos de, por ejemplo, otro plugin o tema.ar

¬ŅPor qu√© es aconsejable el uso de Namespaces en WordPress?

Cuando desarrollamos sobre WordPress, debemos tener en cuenta que para nuestro proyecto van a coexistir clases y funciones que provienen de:

  • El propio WordPress
  • El tema que tengamos activo.
  • Los muchos o pocos plugins que tengamos activos.

Es por esta raz√≥n, que hace a√Īos era normal encontrarse con que dos plugins eran incompatibles entre s√≠, una cosa que frustraba a algunos, llegando a afirmar que la incompatibilidad entre plugins era de lo peor de WordPress.

WordPress y los famosos prefijos de nuestro código

Debes entender como desarrollador WordPress, que debes utilizar usar prefijos en todo lo que harás, de esta forma podrás evitar las colisiones de nombres. 

Usar prefijos es una forma rudimentaria de crear un namespaces; un parche que teníamos que hacer cuando no había nada mejor. Todos aquellos elementos que usen el mismo prefijo forman parte del namespaces. Pero claro, a cambio tenemos un código innecesariamente más complejo, por el simple hecho de que los nombres son más largos por culpa de prefijos que no aportan ninguna utilidad.

¬ŅC√≥mo declarar un namespaces?

Para declarar un namespaces de forma coherente lo haremos siguiendo la secuencia las carpetas, primero se creara una clase llamada Helloworld en la siguiente ruta codigos/funciones/Helloworld.php. Por lo tanto mi namespace sería el siguiente:

namespace Codigos\Funciones;

class Helloworld{
    public static function sayHello(){
        return 'Hello World';
    }    
}

¬ŅC√≥mo utilizar Namespaces para nuestros desarrollos en WordPress?

Afortunadamente, a través de composer, es muy sencillo. En la raíz de nuestro plugin crearemos el archivo composer.json con el siguiente contenido:

 
{
    "name": "nombre del plugiun",
    "description": "descripcion del plugin",
    "require": {
        "php": ">=7.3"
    },
    "autoload": {
        "psr-4": {
            "Mynamespace\\": "includes/"
        }
     }
}

Cuando ya tengamos esto definido, bastará con ejecutar composer install, y se nos creará una carpeta vendor con todo lo necesario. Para poder hacer uso del autoload de Namespaces en nuestro plugin.

require_once plugin_dir_path( __FILE__ ) . 'vendor/autoload.php';

De esta manera podremos llamar a todas las clases estén incluidas en la carpeta includes a través de namespaces.

Consideraciones a tener en cuenta para el uso de namespaces

Cuando crees una clase y declares el namespace, se debe declarar en la parte superior del archivo. Debe ser el primer comando y no puede haber ning√ļn c√≥digo PHP que lo preceda, excepto si utilizas declare.¬†

defined( 'WPINC' ) or die( 'No script kiddies please!' );

/**
* Class Settings
*/
class Settings {
    // Code
}

Lo primero a declarar es nuestro namespace Mynamespace\Admin. Únicamente podremos poner por encima una sentencia declare.

¬ŅY c√≥mo hacemos uso de esta clase? Pues tenemos dos formas. Lo que ya no es necesario es andar haciendo¬†includes¬†o¬†requires. Vamos a ver estas dos formas mediante un ejemplo. Imaginemos que en nuestra clase¬†Settings¬†tenemos un m√©todo est√°tico que nos devuelve un option.

La primera forma es llamando al namespace directamente:

defined( 'WPINC' ) or die( 'No script kiddies please!' );

/**
* Class Assets
*/
class Assets {
    public function my_method() {
        $my_option = Mynamespace\Admin\Settings::get_my_option();
        // code
    }
}

La segunda es declarar un use en el archivo donde vayamos a llamar a este método, justo debajo del namespace de este otro archivo:

defined( 'WPINC' ) or die( 'No script kiddies please!' );

/**
* Class Assets
*/
class Assets {
    public function my_method() {
        $my_option = Settings::get_my_option();
        // code
    }
}

Como ves, bastante sencillo y bastante √ļtil. Y m√°s elegante y legible que poner un prefijo para todo.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *