Actualmente estoy ocupado con un gran complemento de WordPress que consta de un par de clases e interfaces ( que usan el espacio de nombres adecuado ). De la investigación y las respuestas que obtuve de las preguntas anteriores, la mejor opción fue usar la inyección de interfaz ( inyección de dependencia ) para mantener el SOC. Todo en esta etapa funciona según lo previsto.

Ahora me quedo con reunir todo en una clase principal que se utilizará como controlador. En este momento, para probar todo, uso require_once para cargar mis clases e interfaces ( archivos están en una carpeta llamada functions )

EJEMPLO:

require_once( '/functions/INTERFACEA.php' );
require_once( '/functions/CLASSA.php'     );
require_once( '/functions/INTERFACEB.php' );
require_once( '/functions/CLASSB.php'     );
//etc

He oído hablar de los cargadores automáticos, pero no entiendo completamente cómo usarlos en una clase de controlador. Un problema que realmente necesito evitar es que una clase se cargue antes que su interfaz, porque si la secuencia de carga es incorrecta, obtengo un error fatal que indica que mi interfaz no existe.

MI PREGUNTA:

¿Cómo hago un uso adecuado de un autocargador en una clase de controlador para cargar mis clases e interfaces, lo que también se asegura de que mis interfaces se carguen antes que sus respectivas clases?

2
Pieter Goosen 27 ene. 2016 a las 11:21

2 respuestas

La mejor respuesta

Usa composer para cargar automáticamente tus clases. Soporta espacios de nombres para la carga automática y, una vez configurado, todo sería simplemente automático en sus propios espacios de nombres.

Todo lo que tienes que hacer es configurar composer.json

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

Solo necesita el archivo aotoload.php y gestionará todo lo demás.

require __DIR__ . '/vendor/autoload.php';
1
Charlie 27 ene. 2016 a las 08:30

Puedes usar spl_autoload_register

// Defining autoloader
spl_autoload_register(function ($class_name) {

    // just make sure here that $class_name is correct file name
    // and there is $class_name.php file if no the fix it 
    // E.G. use strtoupper etc.
    $class_name = strtoupper($class_name);

    require_once( '/functions/'.$class_name.'.php' );
});

// Then simply use 
$class = new CLASSA();
// if `CLASSA` implements `INTERFACEA` here php 
// will autoload `INTERFACEA.php` and `CLASSA.php` 

Consulte este artículo para obtener más información: http://php.net/manual/en/ language.oop5.autoload.php

2
Armen 27 ene. 2016 a las 08:30