Usuario:ManuelRomero/PHP/autoload
De WikiEducator
< Usuario:ManuelRomero | PHP
Revisión a fecha de 22:29 11 feb 2019; ManuelRomero (Discusión | contribuciones)
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.
spl_autoload_register(function ($clase)){ require($clase); }
- Esto está bien, pero para ello deberían de estar todas las clases en el mismo directorio
- Lo que pretendo es no depender de en qué subdirectorio esté del proyecto.
- Para ello vamos a usar composer y PSR-4.
Por supuesto, siguiendo las buenas prácricas de programación
Cada clase está en un fichero que contiene el mismo nombre que la clase Sólo una clase por fichero
|
- 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
- https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/
- Una alternativa más interesanto que classmap va a ser psr4.
- 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" }