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

De WikiEducator
Saltar a: navegación, buscar
 
(9 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
 +
<div id=seccion>
 
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
Línea 56: Línea 73:
 
</source>
 
</source>
 
*Podemos ver cómo composer ha creado una estructura de carpetas donde ya tiene localizadas todas las clases del proyecto
 
*Podemos ver cómo composer ha creado una estructura de carpetas donde ya tiene localizadas todas las clases del proyecto
[[Archivo:autoload_composer.png]]
+
[[Archivo:autoload_composer.png]]<br />
 
*Y debemos incluir en nuestro proyecto el fichero autoload de composer
 
*Y debemos incluir en nuestro proyecto el fichero autoload de composer
 
<soruce lang=php>
 
<soruce lang=php>
Línea 73: Línea 90:
 
     'E' => $baseDir . '/Classes/class3/E.php',
 
     'E' => $baseDir . '/Classes/class3/E.php',
 
);
 
);
 
+
?>
 
</source>
 
</source>
 
*Podemos ver el resultado
 
*Podemos ver el resultado
Línea 79: Línea 96:
 
Si añadimos nuevos ficheros necesitamos hacer
 
Si añadimos nuevos ficheros necesitamos hacer
 
  adding new files requires '''''composer dumpautoload''''' to regenerate the mapping.
 
  adding new files requires '''''composer dumpautoload''''' to regenerate the mapping.
 +
==Usando PSR4==
 +
*https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/
 +
 +
;Espacio de nombres
 +
* https://diego.com.es/namespaces-en-php
 +
* https://www.php.net/manual/es/language.namespaces.php
 +
*El espacio de nombres o <span style=color:#A04000>namespace </span> es una forma de organizar las clases  evitando conflictos (permitir dos clases diferentes con el mismo nombre) y mejorar la estructura del proyecto
 +
*Es una forma de agrupar clases lo mismo que un directorio agrupa todo su contenido y los permite localizarlo
 +
 +
*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)
 +
<source lang=php>
 +
/home/profesor/dwes/notas.ods
 +
/home/profesor/bd/notas.ods
 +
</source>
 +
{{MRM_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)
 +
<source lang=php>
 +
<?php
 +
namespace MiProyecto;
 +
..
 +
</source>
 +
*El namespace puede tener varios niveles de jerarquía cuidado con la barra  de separación '''''\'''''
 +
<source lang=php>
 +
<?php
 +
namespace MiProyecto\nivel1\subnivel2;
 +
...
 +
</source>
 +
{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
 +
<source lang=php>
 +
{
 +
"autoload":{
 +
    "psr-4":{
 +
        "Nombre_Espacio\\":"Dir_donde_están_las_clases"
 +
      }
 +
    }
 +
}
 +
 +
"psr-4"
 +
}
 +
 +
</source>
 +
</div>

Última revisión de 08:29 29 abr 2020

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"
}