Diferencia entre revisiones de «Usuario:ManuelRomero/ProgramacionWeb/Composer»

De WikiEducator
Saltar a: navegación, buscar
Línea 43: Línea 43:
 
}}
 
}}
  
</div>
+
===Carga automática de clases===
  
 +
*Hasta ahora hemos visto cómo realizar una carga automática simple mediante la función '''spl_autoload_register()'''.
 +
Este método permite cargar clases automáticamente sólo cuando se necesitan, evitando múltiples ''include'' o ''require''.*
  
*Sería ideal tener un sistema que nos permitiera indicar dónde se encuentran las clases, generar automáticamente la autocarga y mantenerlo todo organizado.* 
+
*Ejemplo: autocarga básica suponiendo que todas las clases están en el directorio '''Clases/'''*
Para eso existe '''Composer''', que incorpora diferentes estrategias para el ''autoload'': '''classmap''' y '''PSR-4'''.
+
  
{{MRM_Puntos_clave|
 
*Cada clase en su propio fichero* 
 
*El fichero debe llamarse igual que la clase*
 
}}
 
 
===Usando Composer con ''classmap''===
 
 
*Creamos una estructura de directorios, por ejemplo:*
 
[[Archivo:directorios_autoload.png]]
 
 
*Ejemplo de clase:*
 
 
<source lang=php>
 
<source lang=php>
<?php
+
spl_autoload_register(function($clase){
class B {
+
    require "Clases/$clase.php";
    public function __toString() {
+
});
        return "Hola desde la clase B";
+
    }
+
}
+
 
</source>
 
</source>
  
*Creamos el fichero '''composer.json''' indicando que Composer debe escanear el directorio ''Clases/'':*
+
*También podemos usar una función nominada:*
  
 
<source lang=php>
 
<source lang=php>
{
+
function autocarga($clase){
  "autoload": {
+
     require "Clases/$clase.php";
     "classmap": [
+
      "Clases"
+
    ]
+
  }
+
 
}
 
}
</source>
 
  
*Actualizamos Composer para generar la carga automática:*
+
spl_autoload_register('autocarga');
 
+
<source lang=bash>
+
composer update
+
 
</source>
 
</source>
  
*Composer crea automáticamente la carpeta '''vendor/''' y genera el fichero de autocarga.*
+
*O una función flecha:*
[[Archivo:autoload_composer.png]]
+
 
+
*Ahora sólo tenemos que incluir el autoload en nuestro proyecto:*
+
  
 
<source lang=php>
 
<source lang=php>
<?php
+
$carga = fn($clase) => require "Clases/$clase.php";
require "vendor/autoload.php";
+
spl_autoload_register($carga);
</source>
+
 
+
*Si añadimos nuevos ficheros, recuerda regenerar el autoload:*
+
 
+
<source lang=bash>
+
composer dumpautoload
+
</source>
+
 
+
---
+
 
+
==Usando PSR-4==
+
 
+
*PSR-4 es el método moderno y recomendado de autocarga. Usa los '''namespaces''' para localizar las clases automáticamente sin necesidad de regenerar el autoload cada vez.*
+
 
+
*Referencias recomendadas:* 
+
https://styde.net/curso-de-laravel-5-que-es-psr-4-y-uso-de-los-namespaces/ 
+
https://diego.com.es/namespaces-en-php 
+
https://www.php.net/manual/es/language.namespaces.php
+
 
+
;Espacio de nombres
+
*Un '''namespace''' es una forma de organizar clases, funciones e interfaces evitando conflictos entre nombres.*
+
*Es equivalente a la organización en directorios del sistema de ficheros.*
+
 
+
Ejemplo equivalente en archivos reales:
+
 
+
<source lang=php>
+
/home/profesor/dwes/notas.ods
+
/home/profesor/bd/notas.ods
+
</source>
+
 
+
Puedes tener dos clases con el mismo nombre si pertenecen a distintos namespaces.
+
 
+
{{MRM_Resumen|
+
Los namespaces de PHP permiten agrupar clases, funciones, interfaces y constantes relacionadas.
+
}}
+
 
+
===Declarar un namespace===
+
 
+
*El namespace debe ser la primera línea del fichero (sin espacios previos).*
+
 
+
<source lang=php>
+
<?php
+
namespace MiProyecto;
+
</source>
+
 
+
*También puede tener varios niveles separados por barras invertidas ''\''':*
+
 
+
<source lang=php>
+
<?php
+
namespace MiProyecto\Nivel1\Subnivel2;
+
</source>
+
 
+
{{MRM_Resumen|Title=Comentarios sobre namespaces|
+
*Cada namespace suele corresponder a un directorio. 
+
*No es obligatorio que coincidan exactamente, pero es buena práctica.*
+
}}
+
 
+
---
+
 
+
===PSR-4 en Composer===
+
 
+
*PSR-4 es más potente y elegante que ''classmap'', y no requiere regenerar el autoload cuando se añaden nuevas clases.*
+
 
+
*Se basa completamente en los '''namespaces'''.*
+
 
+
Ejemplo de configuración en '''composer.json''':
+
 
+
<source lang=php>
+
{
+
  "autoload": {
+
    "psr-4": {
+
      "MiProyecto\\": "src/"
+
    }
+
  }
+
}
+
 
</source>
 
</source>
  
Esto significa:
+
*Este sistema funciona correctamente, pero presenta limitaciones:*
  
* Las clases con namespace **MiProyecto** se cargarán desde la carpeta **src/**
+
* Todas las clases deben estar en un mismo directorio **o**
* La clase:
+
* La función debe buscar en múltiples rutas según reglas que tú tengas que programar.
 +
* No escala bien en proyectos grandes.
 +
* No organiza la estructura del proyecto.
  
</div>
+
Puedes ver los ficheros cargados en cada momento con:
</div>
+

Revisión de 20:31 16 nov 2025

Composer

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



Icon define.gif
¿Qué es Composer?

Del mismo modo que un director de orquesta coordina a todos los instrumentos para que la música suene de forma armoniosa, Composer actúa como un orquestador del proyecto PHP. Su función principal es gestionar de forma unificada todos los paquetes, librerías y dependencias que una aplicación necesita para funcionar correctamente.




Icon define.gif
¿Qué hace Composer?

Entre sus funciones principales, Composer me permite:

  • Gestionar automáticamente la autocarga (autoload) de las clases, evitando tener que hacer includes o requires manuales.
  • Instalar librerías y paquetes de terceros dentro de mi proyecto de forma rápida, segura y organizada.




Icon define.gif
Otras funcionalidades importantes de Composer

Además del autoload y la instalación de dependencias, Composer también:

  • Mantiene un fichero de metainformación del proyecto en composer.json, donde se define:
    • autor
    • versión del proyecto
    • licencia
    • dependencias y versiones compatibles
    • scripts personalizados
    • configuración del autoload
  • Controla las versiones exactas instaladas mediante composer.lock, garantizando que todo el equipo trabaja con las mismas librerías.
  • Permite actualizar dependencias de forma controlada con comandos como:
    • composer update
    • composer outdated
  • Facilita compartir el proyecto con otros desarrolladores sin incluir las librerías, gracias a:
    • composer install
  • Permite usar paquetes creados por la comunidad a través de Packagist, el repositorio central de Composer.


Carga automática de clases

  • Hasta ahora hemos visto cómo realizar una carga automática simple mediante la función spl_autoload_register().

Este método permite cargar clases automáticamente sólo cuando se necesitan, evitando múltiples include o require.*

  • Ejemplo: autocarga básica suponiendo que todas las clases están en el directorio Clases/*
spl_autoload_register(function($clase){
    require "Clases/$clase.php";
});
  • También podemos usar una función nominada:*
function autocarga($clase){
    require "Clases/$clase.php";
}
 
spl_autoload_register('autocarga');
  • O una función flecha:*
$carga = fn($clase) => require "Clases/$clase.php";
spl_autoload_register($carga);
  • Este sistema funciona correctamente, pero presenta limitaciones:*
  • Todas las clases deben estar en un mismo directorio **o**
  • La función debe buscar en múltiples rutas según reglas que tú tengas que programar.
  • No escala bien en proyectos grandes.
  • No organiza la estructura del proyecto.
Puedes ver los ficheros cargados en cada momento con: