|
|
Línea 40: |
Línea 40: |
| *Se pueden verificar 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. | | *Se pueden verificar 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. |
| https://www.php.net/manual/es/function.get-include-path.php | | https://www.php.net/manual/es/function.get-include-path.php |
| + | </div> |
| + | |
| + | <div class="slide"> |
| + | ;La autocarga |
| + | |
| *Como vemos, este método presenta el inconveniente de que 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. | | *Como vemos, este método presenta el inconveniente de que 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. |
| *Para ello, de alguna forma habría que añadir un prefijo a cada nombre de fichero de cada clase que identificar la ubicación de directorio | | *Para ello, de alguna forma habría que añadir un prefijo a cada nombre de fichero de cada clase que identificar la ubicación de directorio |
Línea 58: |
Línea 63: |
| public function __toString() | | public function __toString() |
| { | | { |
− | // TODO: Implement __toString() method.
| + | return "<h2>Estoy en la clase |
− | return "<h2>Estoy en la clase " . get_class ($this) . " ubicado en " . __DIR__; | + | " . get_class ($this) . |
| + | " ubicado en " . __DIR__; |
| } | | } |
| </source> | | </source> |
Línea 89: |
Línea 95: |
| echo $a; | | echo $a; |
| echo $b; | | echo $b; |
− | echo $c;> | + | echo $c; |
| </source> | | </source> |
| </div><div class="slide"> | | </div><div class="slide"> |
Revisión de 05:20 30 abr 2020
https://medium.com/swlh/composer-everything-i-should-have-known-794225cde691
La autocarga
- La programación actual es claramente estructurada-modular programando con el paradigma orientado a objetos (existen otros paradigmas)
- PHP es un lenguaje para programar orientado a objetos
- Las buenas prácticas de programación nos llevan a crear diferentes objetos estructurados en distintas carpetas implementadas en ficheros independientes.
- Para cargar de forma automática las clases ya hemos visto como realizar un autoload de cada clase que necesitemos.
- La autocarga
- Para ello escribimos el código en la función anónima que recibe en callback como argumento la función
spl_autload_register.
- En esta situación hemos de saber que las clases las tenemos en el directorio Clases del proyecto
spl_autoload_register(function ($clase)){
require("Clases/$clase.php");
}
- La autocarga
- Esto también lo podríamos poner escribiendo la función nominada
function autocarga($clase){
require("Clases/$clase.php");
}
spl_autoload_register(autocarga);
- La autocarga
- Esto está bien, y previo a utilizar una clase, cargamos previamente el fichero que lo implementa.
- Por lo tanto, solo están cargados los ficheros que necesitemos en un momento dado.
- Se pueden verificar 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.
https://www.php.net/manual/es/function.get-include-path.php
- La autocarga
- Como vemos, este método presenta el inconveniente de que 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.
- Para ello, de alguna forma habría que añadir un prefijo a cada nombre de fichero de cada clase que identificar la ubicación de directorio
Complicando la estructura del directorio
- Vamos a trabajar con una estructura compleja de directorios en un proyecto.
- Supongamos la siguiente estructura de clases en nuestro proyecto como se especifica en la imagen
- Estructura de directorios ejemplo
- Este ejemplo implica la siguiente estructura de directorios y las clases correspondientes
- Estructura de directorios ejemplo
- En cada fichero vamos a escribir el método mágico __toString() para que nos diga el nombre de la clase y el directorio en el que nos encontramos
public function __toString()
{
return "<h2>Estoy en la clase
" . get_class ($this) .
" ubicado en " . __DIR__;
}
- Estructura de directorios ejemplo
- Para poder acceder a cada clase, necesitaríamos tener previamente cargado el fichero que contiene la implementación de la clase.
- Con la función que conocemos de autoload, no podemos hacer de esta forma, podríamos hacer que cada clase tuviera un prenombre que identificara su ubicación y dentro de esta función analizáramos dicho prenombre para localizar el fichero que implementa la clase.
- De momento, para probarlo e identificar nuevos problemas a solucionar, hacemos una carga literal de cada fichero.
- Lo hacemos con objetos ubicados en el directorio librerias
- Estructura de directorios ejemplo
<?php
require "./librerias/A.php";
require "./librerias/B.php";
require "./librerias/C.php";
$a = new A();
$b = new B();
$c = new C();
echo $a;
echo $b;
echo $c;
- Estructura de directorios ejemplo
- Y vemos la siguiente salida
- Estructura de directorios ejemplo
- Con lo que hemos visto hasta ahora de autocarga estaríamos muy limitados por dos temas:
- Los ficheros diferentes están ubicados en distintos directorios
- Hay clases con el mismo nombre y ubicadas en distinto que realizarán distintas tareas ...
- Para cubrir estas situaciones surge los namespace, si bien no nos van a facilitar la autocarga para lo cual tendremos composer
Concepto de namespace
namespace
- 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 mejorando la estructura del proyecto y evitando conflictos (permitir dos clases diferentes con el mismo nombre).
- Es una forma de agrupar clases lo mismo que un directorio agrupa todo su contenido y los permite localizarlo
- En java podríamos asemejarlo al concepto de package
- En un sistema operativo tenemos un concepto muy parecido con los directorios, 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
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 que se establecen (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, Suele coincidir, pero no hay ningún tipo de dependencia
}
- Una vez establecido un namespace en una clase, para acceder a él debemos de referenciarlo en su ubicación
- Podemos crear un alias con la palabra reservada Use
- 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"
}
Autocarga con composer
clasmap
psr-4
psr-4, composer y php
autoload con composer
En este apartado vamos a exponer como realizar la carga de forma automática de clases en nuestro proyecto php¡¡
|
Plantilla:MRM Previos
composer.json
Ubicar las clases en nuestro proyecto
El namespace
- Los espacios de nombres realmente ayudan a organizar su código y a evitar conflictos de nombres dentro de la base de código de su proyecto.
Actualizar/Instalar composer en nuestro proyecto
Usando las clases en nuestro proyecto