27. Namespace en PHP

A medida que nuestro programa va creciendo es muy probable que queramos organizarlo, es decir, crear carpetas y subcarpetas e ir dividiendo nuestros archivos en diferentes documentos. Para ello sirven los namespaces.

Vamos a crear un ejm en el cual hay creadas dos carpetas, Carpeta1 y Carpeta2. Dentro de Carpeta1 tenemos el archivo PHP Humano.php, que tiene la siguiente sintaxis:

Humano.php

<?php

  namespace Carpeta1;

  class Humano {
    public function saludar(){
      echo "Hola desde la clase Humano dentro de la carpeta carpeta1";
    }
  }

 

Y dentro de Carpeta2 tenemos el archivo con el mismo nombre, Humano.php, veamos su sintaxis

Humano.php

<?php

  namespace Carpeta2;

  class Humano {
    public function saludar(){
      echo "Hola desde la clase Humano dentro de la carpeta carpeta2";
    }
  }

 

Paralelo a las carpetas Carpeta1 y Carpeta2 tenemos un archivo index.php con la siguiente sintaxis.

index.php

<?php

  require_once('Carpeta1/Humano.php');
  require_once('Carpeta2/Humano.php');

  $humano1 = new Carpeta1\Humano;
  $humano1->saludar();
  echo "<br />";
  $humano2 = new Carpeta2\Humano;
  $humano2->saludar();

 

Como vemos, para instanciar a las clases del mismo nombre, Humano, se hace como se ve en el ejemplo, llamando a su namespace.

Utilizar un namespace por defecto

Para ello, en nuestro index.php utilizaremos la siguiente sintaxis.

index.php

<?php

  // Esto indica que utilizaremos la carpeta Carpeta1
  use Carpeta1\Humano;

  require_once('29-Carpeta1/Humano.php');
  require_once('29-Carpeta2/Humano.php');

  $humano1 = new Humano;
  $humano1->saludar();

 

Conflicto entre dos clases con el mismo nombre en dos carpetas distintas

En este caso lo que podemos hacer es darle distinto nombre mediante la keyword as, de la siguiente manera.

index.php

<?php

  // Esto indica que utilizaremos la carpeta Carpeta1
  use Carpeta1\Humano;
  use Carpeta2\Humano as Humano2;

  require_once('29-Carpeta1/Humano.php');
  require_once('29-Carpeta2/Humano.php');

  $humano1 = new Humano;
  $humano1->saludar();

  echo "<br />";

  $humano2 = new Humano2;
  $humano2->saludar();