Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/autoload»

De WikiEducator
Saltar a: navegación, buscar
Línea 1: Línea 1:
 
https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa
 
https://medium.com/tech-tajawal/php-composer-the-autoloader-d676a2f103aa
  
Para cargar de forma automática las clases se usa la función autload implementado la función anónima que recibe en callback como argumento.
+
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
 
<source lang=php>
 
<source lang=php>
 
spl_autoload_register(function ($clase)){
 
spl_autoload_register(function ($clase)){
   require($clase);
+
   require("Clases/$clase.php");
 
+
 
}
 
}
 
</source>
 
</source>
 +
*Esto también lo podríamos poner escrbiendo la función nominada
 +
<source lang=php>
 +
function autocarga($clase){
 +
  require("Clases/$clase.php");
 +
}
 +
 +
spl_autoload_register(autocarga);
 +
</source>
 +
 +
 +
*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.
 +
  
*Esto está bien, pero para ello deberían de estar todas las clases en el mismo directorio
+
*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
*Lo que pretendo es no depender de en qué subdirectorio esté del proyecto.
+
*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.
*Para ello vamos a usar composer 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.
Por supuesto, siguiendo las buenas prácricas de programación
+
  
 
{{MRM_Puntos_clave|Cada clase está en un fichero que contiene el mismo nombre que la clase
 
{{MRM_Puntos_clave|Cada clase está en un fichero que contiene el mismo nombre que la clase
 
Sólo una clase por fichero
 
Sólo una clase por fichero
 
}}
 
}}
*Vemos como composer realiza todo lo que necesitamos
+
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.
 
*Veamos el ejemplo.
 
;Creamos una estructura de directorios
 
;Creamos una estructura de directorios

Revisión de 06:17 10 dic 2019

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

{
"autoload":{
    "psr-4":{
         "Nombre_Espacio//":"Dir_donde_están_las_clases"
      }
    }
}
 
"psr-4"
}