Vi siete mai serviti di una "classe includitrice" (che include in ordine N files che vi servono) e, all'interno di questa, una "classe instanziatrice" (che ritorna un'array con chiavi $nomeClasse => $istanzaDiStaClasse) che poi può essere utilizzata direttamente per fare varie cose?

Mi piacerebbe ricevere pareri a riguardo.

----------------------------------------------------------------------------------------

Nel frattempo si assuma una directory structure di base di questo tipo:

index.php
/site/model/ ...
/site/view/ ...
/site/controller/ ...
/site/boot/ ...



Prototipo "classe includitrice" di file necessari, passati sottoforma di valori in array, nell'ordine in cui vanno inclusi.

Codice PHP:
<?php

class BootFileIncluder
{
   private 
$_classPackage = array();

   public function 
__construct(array $files) {

      foreach(
$files as $filetype => $file) {

         if (
file_exists(SERVER_ROOT DS "site" DS $filetype DS $file '.php'
             && 
is_readable(SERVER_ROOT DS "site" DS $filetype DS $file '.php')
         ) {

            include 
'/site/' $filetype '/' $file '.php';

            if(
$filetype == 'view') { // Skip files from /view folder
               
continue;
            }
            
$this->_classPackage[] = $filetype $file;
          } else {

            die(
'<h2>Errore nel BootFileIncluder</h2>File [b]' $filetype '.' $file '.php[/b] non trovato');
          }
      }
   }

   public function 
getClassPackage() {

      include_once 
'/site/boot/BootClassInstantiator.php';
      
$boot = new BootClassInstantiator($this->_classPackage);
      
$classArray $boot->getInstances();
      return 
$classArray;
   }
}

Esempio "classe istanziatrice", la quale riceve i dati dalla classe precedente, nell'ordine prestabilito.

Codice PHP:
<?php

class BootClassInstantiator {

   private 
$_instances = array();

   public function 
__construct(array $classPackage) {

      foreach(
$classPackage as $class) {

         
$this->_instances[$class] = new $class;
      }
   }

   public function 
getInstances() {
      return 
$this->_instances;
   }

}

E file index.php , entry point

Codice PHP:
<?php

 define
('SERVER_ROOT'__DIR__ );
 
define('DS'DIRECTORY_SEPARATOR);
 
define('WEB_ROOT' 'http://127.0.0.1:8080/framework/'); 
 
 include_once 
SERVER_ROOT '\site\boot\BootFileIncluder.php';
 
 
$home = array(
  
'model'      => 'Home',
  
'controller' => 'Home',
  
'view'       => 'Home',
 );

 
$classPack = new BootFileIncluder($home);
 
 
$arr = array();
 
$arr $classPack->getClassPackage();

 
// Modo 1: usare notazione array
 
$arr['modelHome']->test(); 

 
/**
  * Modo 2
  *
  * Estrazione, per evitare di digitare $arr['modelHome'] che 
  * puo' essere ostico da leggere/scrivere
  */

 
extract($arr);
 
$modelHome->test();

E per finire, le classi controller e model si chiameranno rispettivamente "controllerHome" e "modelHome" per mantenere coerenza nella naming convention.


L'avete mai usato?
Se si ma avete cambiato rotta, perchè?
Consigli, pareri, riflessioni a riguardo?


Grazie in anticipo.