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.