Usuario:ManuelRomero/PHP/autoload

De WikiEducator
Saltar a: navegación, buscar

https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa

Para cargar de forma automática las clases ya hemos visto como realizar un autoload de cada clase que necesitemos. Para ello escribimos el código en la función anónima que recibe en callback como argumento la función spl_autload_register. Suponiendo que las clases las tenemos en el directorio Classes del proyecto

spl_autoload_register(function ($clase)){
  require("Clases/$clase.php");
}
  • Esto también lo podríamos poner escrbiendo la función nominada
function autocarga($clase){
  require("Clases/$clase.php");
}
 
spl_autoload_register(autocarga);


  • Esto está bien, y hace que sólo estén cargados los ficheros que necesitemos en un momento dado

Puedes comprobar los ficheros cargados en un momento dado invocando a la función get_included_files() que te devuelve un array con todos los ficheros cargados. Este método presenta el inconveniente que o bien tienes todas las clases implementadas en un mismo directorio, o bien en la función de autocarga busca en directorios según el nombre de la clase, lo cual puede ser muy incómodo y poco productivo.


  • Estaría bien un software que le podamos decir en un fichero dónde se ubican cada clase de nuestro proyecto, y que luego se pueda cargar automáticamente el fichero cuando sea necesario disponer de él
  • Para este comentidoo podemos usar ello vamos a usar composer que tiene diferentes opciones que pueden satisfacer esta necesidad. Analizaremos dos de ellas classmap y PSR-4.

Por supuesto, siguiendo las buenas prácricas de programación, seguimos escribiendo cada clase en un fichero con el mismo nombre de la clase que implementa.



Icon key points.gif

Puntos clave

Cada clase está en un fichero que contiene el mismo nombre que la clase Sólo una clase por fichero


Composer es lo que se conoce como un orquestador, es decir un software que va a permitir que mi aplicación (la orquesta) funcione bien usando diferentes ficheros y diferentes librerías (los instrumentos de la orquesta). Composer se va a encargar de buscar los ficheros y librerías necesarias con la versión correspondiente para que todo funcione correctamente. Por supuesto, todo lo que necesitamos lo tendremos que especificar en un fichero. Este fichero se llama composer.json'

  • Vemos como composer' realiza todo lo que necesitamos
  • Veamos el ejemplo.
Creamos una estructura de directorios

Directorios autoload.png

En cada directorio creamos clases, para el ejemplo solo muestran un texto
<?php
/**
 * Created by PhpStorm.
 * User: manuel
 * Date: 25/01/19
 * Time: 17:54
 */
 
class B
{
    public function __toString()
    {
        // TODO: Implement __toString() method.
        return "Hola desde la clase B";
    }
}
  • Esto para cada una de las clases.

ahora escribimos un fichero composer

{
  "autoload": {
    "classmap": [
      "Classes"
    ]
  }
}
  • a continuación actulizamos composer
composer update
  • Podemos ver cómo composer ha creado una estructura de carpetas donde ya tiene localizadas todas las clases del proyecto

Autoload composer.png

  • Y debemos incluir en nuestro proyecto el fichero autoload de composer

<soruce lang=php> <?php

// autoload_classmap.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__)); $baseDir = dirname($vendorDir);

return array(

   'A' => $baseDir . '/Classes/A.php',
   'B' => $baseDir . '/Classes/B.php',
   'C' => $baseDir . '/Classes/class2/C.php',
   'D' => $baseDir . '/Classes/class3/D.php',
   'E' => $baseDir . '/Classes/class3/E.php',

); ?> </source>

  • Podemos ver el resultado

Ejercicios autoload.png Si añadimos nuevos ficheros necesitamos hacer

adding new files requires composer dumpautoload to regenerate the mapping.

Usando PSR4

Espacio de nombres
  • De hecho es el mismo concepto, de esta forma no tendremos ningún problema en tener dos ficheros con el mismo nombre (en diferente directorio)
 /home/profesor/dwes/notas.ods
 /home/profesor/bd/notas.ods


Icon summary.gif
Resumen
Los espacios de nombres de PHP permiten agrupar
clases, funciones, interfaces y constantes relacionadas.


Declarar un namespace
  • Debe de ser la primera instrucción del fichero (Cuidado incluso con espacios en blanco)
<?php
namespace MiProyecto;
..
  • El namespace puede tener varios niveles de jerarquía cuidado con la barra de separación \
<?php
namespace MiProyecto\nivel1\subnivel2;
...

{MRM_Resumen|Title=Algunos comentarios|

  • Cada namespace referencia a una ubicación en un directorio
  • No tiene por qué coincidir el namespace con el nombre de directorio, pero suele ser una buena práctica

}

  • Una alternativa más interesante que classmap va a ser psr4.
  • Con ella conseguimos no tener que volver a invocar a composer, cada vez que añadamos nuevas clases
  • Hace la ejecución mucho más rápida, aunque al principio da la impresión de mas engorroso y menos sencillez.
  • psr-4, está basado en el nombre de espacios o namespace

namespace

  • Es una forma de organizar nuestras clases. para que podamos usar incluso clases con el mismo nombre (cada una de ellas que tenga un nombre de espacio diferente
  • para ello ponemos en una clase un nombre al principio de la clase
  • Todas las clases de ese directorio pertenecerán la mismo namespace


  • Con ella no vamos a tener que regenerar el composer cada vez que añadamos una clase
  • Añadimos en composer.json
{
"autoload":{
    "psr-4":{
         "Nombre_Espacio\\":"Dir_donde_están_las_clases"
      }
    }
}
 
"psr-4"
}