Skip to content

5 autoload en php

@intelguasoft edited this page Jan 22, 2020 · 1 revision

Curso Master PHP

Auto-carga (Autoload)

Como norma general es una buena idea guardar las clases PHP en archivos separados, con una clase por cada archivo. Por ejemplo si tenemos un foro, tendríamos la clase User dentro del archivo User.php, y la clase Topic en el archivo Topic.php. Lo normal es poner estos archivos de clases en una carpeta de la aplicación:

classes/
    User.php
    Topic.php

Antes de que apareciera autoload, si se necesitaba usar una de las clases anteriores, primero se incluía con include o require:

require_once("classes/User.php");
$usuario = new User();

Muy probablemente User.php no sería el único archivo a incluir, por lo que se solían generar largas listas con include y require.

El mantener las clases separadas y organizadas permite utilizar el autoloading. Para ello, se crea una función __autoload() en el arranque de la aplicación. Entonces, cuando el código intente crear una instancia que PHP desconoce todavía, PHP llamará automáticamente a la función __autoload(), pasándole el nombre de la clase que está intentando instanciar. El objetivo de la función es localizar e incluir el archivo de la clase. PHP ahora podrá entonces cargar la clase que antes desconocía, y crear el objeto.

Ejemplo de función autoload:

function __autoload($nombreClase) {
    $nombreClase = strtolower($nombreClase);
    $directorio = "classes/{$nombreClase}.php";
    if(file_exists($directorio)) {
        require_once($directorio);
    } else {
        die("El archivo {$nombreClase}.php no se ha podido encontrar.");
    }
}

Ahora todas las clases que se encuentren en el directorio /classes se cargarán (siempre y cuando el archivo tenga el mismo nombre que la clase a la cual se llama).

Existe una alternativa mejor y más flexible mediante la función spl_autoload_register() (de hecho es posible que la función __autoload() quede obsoleta y sea eliminada en el futuro). spl_autoload_register() acepta una función callable como parámetro donde se puede definir una lógica concreta para la carga de clases. Con spl_autoload_register() es posible definir varias funciones para la carga de clases (lo que no es posible con __autoload()):

function miAutoloadUno($clase){
    require "/directorio/.$clase.php";
}
function miAutoloadDos($clase){
    require "/otroDirectorio/.$clase.php";
}
spl_autoload_register("autoloadUno");
spl_autoload_register("autoloadDos");

Algunas otras funciones útiles de spl_autoload:

Desde PHP 5.3 es posible el uso de namespaces en PHP. Un namespace permite crear un nombre de directorio para un archivo y luego éste puede ser referenciado desde cualquier parte del script.

El estándar PSR-4 permite enlazar los namespaces con directorios de carpetas reales. En la actualidad es lo más cómodo utilizar** composer** (o un autoloader de algún framework) para el manejo de la carga de clases automática, y usar el estándar PSR-4 (actualmente el más recomendado). Si por ejemplo tenemos la siguiente estructura:

/app
/public
/src
    Usuario.php
    Topic.php
/vendor

Suponemos que el namespace Proyecto se encuentra en /src. El directorio /src representaría el nivel más alto del namespace. Si utilizamos composer para cargar las clases, simplemente hay que decirle a composer cómo cargarlas. Vamos a indicarle que utilice el estándar PSR-4 desde composer.json:

{
    "autoload": {
        "psr-4":{
            "Proyecto\\": "src/"
        }
    }
}

Para más información del autoloading en composer, puedes visitar la documentación.

Anterior Siguiente

Indice de contenidos

Básicos Sintaxis básica
Operadores
Operadores bit a bit
Variables
Estructuras de control
Constantes y constructores base
Espacio de nombres
Extensiones
Configuraciones
Variables al descubierto
Recolector de basuras
Rendimiento (Performance)
Funciones Funciones
Argumentos en funciones
Funciones variables
Valores por referencia en funciones
Funciones que devuelven algo
Ámbito de variables
Funciones anónimas y closure's
Cadenas y patrones Las comillas y las cadenas de caracteres
Heredoc y Nowdoc
Comparando cadenas de caracteres
Extracción en cadenas de caracteres
Análisis en cadenas de caracteres
Reemplazos en cadenas de caracteres
Formato de cadena de caracteres
Expresiones regulares (RegEx)
Codificación de caracteres
Codificación en cadenas de caracteres
Arreglos (Array's) Arreglos
Arreglos asociativos
Iterar arreglos
Funciones de arreglos
SPL Arreglos mediante objetos
Conversión de arreglos
Archivos (I/O) Manejo de archivos
Lectura de archivos
Escritura de archivos
Funciones del sistema de archivos
Socket's y archivos
Streams (?)
Seguridad Concepto y funcionamiento CGI
Configurando la seguridad
Seguridad en Sesiones
Ataques XSS
Ataques CSRF
Ataques SQLInjection
Ataques CodeInjection
Ataques EmailInjection
Filtrado de datos de entrada
Escape de datos de salida
Encriptación y contraseñas
Seguridad en el almacenamiento de datos
Seguridad en la subida de datos
SSL y OpenSSL
Base de datos Principios básicos SQL
Los joins en SQL
Principales funciones SQL
Preparando sentencias SQL
Transacciones en SQL
Algo de PDO
Programación Orientada a Objetos Instancias de clases
Modificadores y herencia de clases
Interfaces
Excepciones
Auto-carga (Autoload)
Reflexión (Reflection)
Determinación de tipos (Type hinting)
Constantes de clase
Enlace estático de ejecución (Late Static Binding)
Métodos mágicos
Librería estándar PHP (SPL)
Generadores (Generators)
Traits
Clases abstractas
Formatos de información Algo de XML
Algo de SimpleXML
Algo de XML Parser
Algo de PHP DOM
Algo de Web Services
Web Services con SOAP
Algo de REST
Algo de JSON
Formato de fecha y hora
Características web's Sesiones
Formularios
Métodos GET y POST
Cookies
Protocolo HTTP y sus headers
Autenticación HTTP
Códigos de estado HTTP
Referencias Referencias
Recopilación
Conclusión

Clone this wiki locally