Diferencia entre revisiones de «Usuario:ManuelRomero/PHP/autoload»
(3 revisiones intermedias por el mismo usuario no mostrado) | |||
Línea 98: | Línea 98: | ||
==Usando PSR4== | ==Usando PSR4== | ||
*https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/ | *https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/ | ||
− | * | + | |
− | * Una alternativa más | + | ;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 | *Con ella no vamos a tener que regenerar el composer cada vez que añadamos una clase | ||
*Añadimos en composer.json | *Añadimos en composer.json | ||
Línea 106: | Línea 149: | ||
"autoload":{ | "autoload":{ | ||
"psr-4":{ | "psr-4":{ | ||
− | "Nombre_Espacio | + | "Nombre_Espacio\\":"Dir_donde_están_las_clases" |
} | } | ||
} | } |
Ú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.
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
- 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
- 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
Si añadimos nuevos ficheros necesitamos hacer
adding new files requires composer dumpautoload to regenerate the mapping.
Usando PSR4
- Espacio de nombres
- https://diego.com.es/namespaces-en-php
- https://www.php.net/manual/es/language.namespaces.php
- El espacio de nombres o namespace 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)
/home/profesor/dwes/notas.ods /home/profesor/bd/notas.ods
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" }