trim($codicePHP));
return $prec[$src];
}
/**
* Estrae un array con le classi individuate nel file e relativo chk
*
* @param string $file
* @param string $chk se valorizzato non viene calcolato ma si prende per buono
* @ignore
* @return array
*/
protected function &estrai_classi($file,$chk=null) {
$classi=array();
if ($chk===null) $chk=self::calcola_chk($file);
$sorgenteScript= &self::minimizza_codice($file);
if (preg_match_all(self::$individua_classi,$sorgenteScript,$matches))
foreach ($matches[1] as &$classe) $classi[strtolower($classe)]=$chk;
//echo ''; echo "$file\n"; print_r($matches);
return $classi;
}
/**
* Cerca classi nei vari file
* @ignore
* @param string $percorso percorso base in cui si ricerca
* @param array $percorsi_esclusi array con i percorsi da non indicizzare
* @param array $classi array in cui vengono inserite le classi trovate man mano
* @param int $profonditamax max profondità nella ricerca delle sottodirectory
*/
protected function scanClass($percorso,&$percorsi_esclusi,&$classi,&$profonditamax,$profondita=1) {
if (is_dir($percorso)) $files=@scandir($percorso);
else {$files=array(basename($percorso));
$percorso=dirname($percorso);
$profonditamax=1;
}
foreach ($files as &$file)
{$percorsoCorrente=$percorso.DIRECTORY_SEPARATOR.$file;
if($file!='.' && $file!='..' && !isset($percorsi_esclusi[$percorsoCorrente]))
{
if (stripos($percorsoCorrente,'.php',strlen($percorsoCorrente)-4)!==false ||
stripos($percorsoCorrente,'.inc',strlen($percorsoCorrente)-4)!==false)
{
$classi_estratte=&$this->estrai_classi($percorsoCorrente);
foreach ($classi_estratte as $classe=>&$info) $classi[$classe][$percorsoCorrente]=&$info;
}
elseif (($profonditamax==0 || $profondita<$profonditamax) && is_dir($percorsoCorrente) )
$this->scanClass($percorsoCorrente,$percorsi_esclusi,$classi,$profonditamax,$profondita+1);
}
}
}
/** @ignore */
function __destruct() {
if (is_array(@ob_get_status())) ob_end_flush();//invocato sempre alla fine dell script quindi prima di salvare pulisce eventuali buffer
if ($this->reloaded) {
foreach ($this->reloaded as $percorso=>$null)
self::scrivi_file($this->dirSaves.DIRECTORY_SEPARATOR.str_replace(array(':',DIRECTORY_SEPARATOR),array('^','^'),$percorso).'.php',$this->indici[$percorso]);
if(function_exists('apc_clear_cache')) apc_clear_cache();
if(function_exists('accelerator_reset')) accelerator_reset();
}
}
function &get_indici($percorso=''){
if ($percorso) return $this->indici[$percorso];
else return $this->indici;
}
}
/**
* Ottimizzazione della myAutoloader
* @see myAutoloaders
*
*/
class myCachedAutoloader extends myAutoloader {
protected /** @ignore */ $da_salvare=array(),$noautoload_cache_exists=true,$usa_cache_classi=true,$classi_pronte=array(),$noInclude=false;
protected /** @ignore */ static $da_eseguire;
/** Restituisce l'istanza della classe, essendo un singleton l'sianza è sempre la stessa
*
* @access public
* @param string $dirSaves percorso in cui salvare i file di indicizzazione
*/
static function get_Istanza($dirSaves) {
if (self::$istanza!==null) {if (is_dir($dirSaves)) self::$istanza->set_dir($dirSaves);
return self::$istanza;
}
else return self::$istanza=new myCachedAutoloader($dirSaves);
}
/**
* disabilita include, require nel main degli script inclusi
*
* @param boolean/array $modo se false disabilià l'opzione se omesso o true si applica a tutti
* se è un array indica a quali script non applicare
* @return istanza corente
*/
function set_noInclude($modo=true) {
if (is_bool($modo)) $this->noInclude=$modo;
else foreach ($modo as $path) if (is_file($path)) $this->noInclude[realpath($path)]=true;
return $this;
}
/**
* disabilita autoload nella funzione case_exists,
* degli script inclusi
*
* @param boolean/array $modo se false disabilià l'opzione se omesso o true si applica a tutti
* se è un array indica a quali script non applicare
* @return istanza corente
*/
function set_noautoload_cache_exists($modo=true) {
if (is_bool($modo)) $this->noautoload_cache_exists=$modo;
else foreach ($modo as $path) if (is_file($path)) $this->noautoload_cache_exists[realpath($path)]=true;
return $this;
}
/**
* se true il contenuto dei file indicizzati, viene man mano
* memorizzato su disco
*
* @param boolean $usa_cache_classi
* @return istanza corente
*/
function usa_cache_classi($usa_cache_classi){
$this->usa_cache_classi=$usa_cache_classi;
return $this;
}
/** @ignore */
static function class_exists($classe) {
return class_exists($classe,false);
}
/** @ignore */
public static function error_handler($errno , $errstr ){
switch ($errno) {
case E_NOTICE:
case E_STRICT:
case E_USER_NOTICE:
return false;
break;
case E_WARNING:
case E_USER_WARNING:
$errors = "Warning";
break;
case E_ERROR:
case E_USER_ERROR:
$errors = "Fatal Error";
break;
default:
$errors = "Ignoto";
break;
}
if (ini_get("display_errors"))
print("
\n$errors: $errstr
".(self::$da_eseguire)."
\n\n\n\n");
if (ini_get('log_errors'))
error_log("PHP $errors: $errstr\n".self::$da_eseguire );
return true;
}
/**
* Effettua evalutazione del codice passato,
* se per caso c'è un main eventuali variabili definite vengono "globalizzate"
*
* @param string $____phpCode
* @ignore
*/
protected static function myEval ($____phpCode) {//echo '',$____phpCode,'
';
if (!trim($____phpCode) || $____phpCode==';') return;
if(!self::$debug) eval($____phpCode);
else {
set_error_handler('myCachedAutoloader::error_handler');
self::$da_eseguire=&$____phpCode;
if (@eval("$____phpCode ; return true;")!==true) trigger_error('Errore');
restore_error_handler();
}
foreach (get_defined_vars() as $____k=>$____v)
if ($____k!='____phpCode')
{ global $$____k;
$$____k=&$____v;
}
}
/** @ignore */
function esegui_classe($classe,$tentativi=0) {
if (!isset($this->classi_pronte[$classe]))
{
$infoclasse=&$this->cerca_classe($classe,$tentativi);
$md5fileClasse=md5($infoclasse['file']);
$define="define('__FILE__{$md5fileClasse}__','".addslashes($infoclasse['file'])."');define('__DIR__{$md5fileClasse}__','".addslashes(dirname($infoclasse['file']))."');";
$percorsoCache=$this->dirSaves.DIRECTORY_SEPARATOR.$md5fileClasse.'.class.php';
if ($this->usa_cache_classi)
{
$classeCache=self::leggi_file($percorsoCache);
if ($classeCache['chk']==$infoclasse['chk'] &&
count($classeCache['classi'])) {self::myEval($classeCache['Main']);
$this->classi_pronte+=$classeCache['classi'];
}
else unset($classeCache);
}
if (!isset($classeCache))
{
$sorgenteScript=&self::minimizza_codice($infoclasse['file']);
//$sorgenteScript=preg_replace(self::$elimina_commenti_lunghi,'',$sorgenteScript);
$sorgenteScript=preg_replace('/(?\:]{1})__FILE__(?![a-z0-9\_\>\:]{1})/Ss',"__FILE__{$md5fileClasse}__",$sorgenteScript);
$sorgenteScript=preg_replace('/(?\:]{1})__DIR__(?![a-z0-9\_\>\:]{1})/Ss',"__DIR__{$md5fileClasse}__",$sorgenteScript);
if ($this->noautoload_cache_exists===true || !isset($this->noautoload_cache_exists[$infoclasse['file']]))
{
$sorgenteScript=preg_replace('/(?\:]{1})class_exists\s*\(/iSs',' myCachedAutoloader::class_exists(',$sorgenteScript);
}
preg_match_all(self::$individua_classi,$sorgenteScript,$matches);
$n=count($matches[0]);
$startPos=strpos($sorgenteScript,$matches[0][0]);
$sorgenteTemp=$sorgenteScript;
for ($i=0;$i<$n;++$i) {
$class_name=trim(strtolower($matches[1][$i]));
if ($i+1>=$n) $classi[$class_name]=$bodyClass=trim(substr($sorgenteScript,$startPos));
else {$endPos=strpos($sorgenteScript,$matches[0][$i+1],$startPos+strlen($class_name)+1);
$classi[$class_name]=preg_replace(array('~^[ph]{,3}\s~isS',
'~\s\\?>~isS'
),
array('',''),
$bodyClass=trim(substr($sorgenteScript,$startPos,$endPos-$startPos)));
$startPos=$endPos;
}
$this->classi_pronte[$class_name]=&$classi[$class_name];
$sorgenteTemp=str_replace($bodyClass, '', $sorgenteTemp);
}
if ($classi) $Main=$define.str_ireplace(array(''),'',trim($sorgenteTemp));
else $Main=$define;
if ($this->noInclude===true || !isset($this->noInclude[$infoclasse['file']])) $Main=trim(str_ireplace(array('include_once(','require_once(','include(','require('),'(',$Main));
if ($this->usa_cache_classi) $this->da_salvare[$percorsoCache]=array('Main'=>$Main,
'classi'=>$classi,
'chk'=>$infoclasse['chk']);
self::myEval($Main);
unset($Main);
}
}
self::myEval($this->classi_pronte[$classe]); unset($this->classi_pronte[$classe]);//ormai non serve più
}
/** @ignore */
function __destruct() {
parent::__destruct();
foreach ($this->da_salvare as $percorsoCache=>&$array) self::scrivi_file($percorsoCache,$array);
}
}
/**
* Prevede la scomposizione dei file con le classi in tanti file singoli
* @see myAutoloaders
*
*/
class myFastCachedAutoloader extends myCachedAutoloader {
static /** @ignore */ $MainUsati=array();
/** Restituisce l'istanza della classe, essendo un singleton l'sianza è sempre la stessa
* @access public
* @param string $dirSaves percorso in cui salvare i file di indicizzazione
*/
static function get_Istanza($dirSaves) {
if (self::$istanza!==null) {if (is_dir($dirSaves)) self::$istanza->set_dir($dirSaves);
return self::$istanza;
}
else return self::$istanza=new myFastCachedAutoloader($dirSaves);
}
/**
* Effettua inclusione dello script passato
* se per caso c'è un main con eventuali variabili definite vengono "globalizzate"
* @param string $____file
* @ignore
*/
/*protected static function myInclude($____file) {
@include($____file);
//foreach (get_defined_vars() as $____k=>$____v)
// if ($____k!='____file' )
// { global $$____k;
// $$____k=$____v;
// }
}*/
/** @ignore */
function esegui_classe($classe,$tentativi=0) {
static $classeCache;
if (!$this->usa_cache_classi) return parent::esegui_classe($classe,$tentativi);
$infoclasse=$this->cerca_classe($classe,$tentativi);
$md5fileClasse=md5($infoclasse['file']);
//define("__FILE__{$md5fileClasse}__",$infoclasse['file']);
$define="define('__FILE__{$md5fileClasse}__','".addslashes($infoclasse['file'])."');define('__DIR__{$md5fileClasse}__','".addslashes(dirname($infoclasse['file']))."');";
$percorsoCache=$this->dirSaves.DIRECTORY_SEPARATOR.$md5fileClasse;
if ($classeCache[$percorsoCache] || is_file("$percorsoCache.php"))
{
if (!($classeCache[$percorsoCache]['chk']=self::$MainUsati[$md5fileClasse]))
{$classeCache[$percorsoCache]=self::leggi_file("$percorsoCache.php");
self::myEval($classeCache[$percorsoCache]['Main']);
self::$MainUsati[$md5fileClasse]=$classeCache[$percorsoCache]['chk'];
}
if ($classeCache[$percorsoCache]['chk']==$infoclasse['chk'])
{
return Include("$percorsoCache.$classe.php");
}
}
$sorgenteScript= &self::minimizza_codice($infoclasse['file']);
// $sorgenteScript=preg_replace(self::$elimina_commenti_lunghi,'',$sorgenteScript);
$sorgenteScript=preg_replace('/(?\:]{1})__FILE__(?![a-z0-9\_\>\:]{1})/Ss',"__FILE__{$md5fileClasse}__",$sorgenteScript);
$sorgenteScript=preg_replace('/(?\:]{1})__DIR__(?![a-z0-9\_\>\:]{1})/Ss',"__DIR__{$md5fileClasse}__",$sorgenteScript);
if ($this->noautoload_cache_exists===true || !isset($this->noautoload_cache_exists[$infoclasse['file']]))
$sorgenteScript=preg_replace('/(?\:]{1})class_exists\s*\(/iSs',' myCachedAutoloader::class_exists(',$sorgenteScript);
//$sorgenteScript=preg_replace('/\b(class_exists)\s*\(/iSs','myCachedAutoloader::class_exists(',$sorgenteScript);
preg_match_all(self::$individua_classi,$sorgenteScript,$matches);
$n=count($matches[0]);
$startPos=strpos($sorgenteScript,$matches[0][0]);
for ($i=0;$i<$n;++$i) {
$class_name=trim(strtolower($matches[1][$i]));
if ($i+1>=$n) $phpclasse=trim(substr($sorgenteScript,$startPos));
else {$endPos=strpos($sorgenteScript,$matches[0][$i+1],$startPos+strlen($class_name)+1);
$phpclasse=trim(substr($sorgenteScript,$startPos,$endPos-$startPos));
$startPos=$endPos;
}
$classi[]=$phpclasse;
if ($class_name==$classe) $da_eseguire=$phpclasse;
self::file_write("$percorsoCache.$class_name.php",' '.preg_replace(array('~^[ph]{,3}\s~isS',
'~\s\\?>~isS'
),
array('',''),
trim($phpclasse)).' ?>');
}
if ($classi) $Main=$define.trim(str_ireplace(array(''),'',str_replace($classi,'',$sorgenteScript)));
else $Main=$define;
if ($this->noInclude===true || !isset($this->noInclude[$infoclasse['file']])) $Main=trim(str_ireplace(array('include_once(','require_once(','include(','require('),'(',$Main));
self::$MainUsati[$md5fileClasse]=$classeCache[$percorsoCache]['chk'];
self::scrivi_file("$percorsoCache.php",
array('chk'=>$infoclasse['chk'],'Main'=>$Main)
);
self::myEval($Main); unset($Main);
self::myEval($da_eseguire);
}
}
class mystupidautoloader extends myAutoloader{
/** @ignore */
protected function __construct(){
}
function add_percorso($percorso,$null,$profondita=0,$livello=0) {
if ($livello>$profondita) return $this;
if (is_file($percorso)) include_once($percorso);
if (is_dir($percorso))
foreach (GLOb("$percorso/*.php") as $dir)
$this->add_percorso($dir,$null,$profondita,$livello+1);
return $this;
}
function __descruct(){
}
}
/**
* E' una classe di utilità che sceglie il tipo di autoloader migliore a seconda della configurazione del server
* In automatico include le myForms
*
* myAutoloaders::get_Istanza() //solo questo carica l'indicizzazione delle myForms nella modalità migliore
* ->add_percorso('./include',2) //include tutte le classi sotto include limitandosi a 2 sottodirectori
* ->add_percorso('./include/classi.php'); //include le classi in classi.php
*
*
*/
abstract class myAutoloaders{
protected static /** @ignore */$modalita,$istanza;
/**
* Forza l'uso della myAutoloader che prevede inclusione secca dei file
* per farne meglio il debug
*
* @access public
* @param 1|2 $modalita se 1 si usa un myAutoloader semplice (in pratica si sfrutta solo l'indicizzazione delle classi)
* 2 si usa la l'Autoloader scelto ma in modalità di debug
*/
public static function set_debugging($modalita=1) {
self::$modalita=$modalita;
}
/**
* Restituisce l'istanza tra myAutoloader,myCachedAutoloader e myFastCachedAutoloader più adatto.
* Tutt le myForms sono automaticamente comprese.
*
* @param string $percorso
* @return myAutoloader|myCachedAutoloader|myFastCachedAutoloader
*/
public static function get_Istanza($percorso='',$forzaClasse=''){
static $percorso_prec;
if (!$percorso) $percorso=$percorso_prec;
if (!$percorso) $percorso="$_SERVER[DOCUMENT_ROOT]/myAutoloader";
if (!is_dir($percorso)) @mkdir($percorso,0777,true);
$percorso_prec=$percorso;
if ($forzaClasse)
switch (strtolower($forzaClasse))
{ case 'mystupidautoloader': $istanza=myStupidAutoloader::get_Istanza($percorso);
break;
case 'myfastcachedautoloader': $istanza=myFastCachedAutoloader::get_Istanza($percorso);
break;
case 'mycachedautoloader': $istanza=myCachedAutoloader::get_Istanza($percorso);
break;
case 'myautoloader': $istanza=myAutoloader::get_Istanza($percorso);
break;
}
elseif (self::$modalita==1) $istanza=myAutoloader::get_Istanza($percorso);
else {
if (array_intersect(array('zend platform','eaccelerator','zend optimizer+','apc','xcache'),
array_keys(array_change_key_case((array_flip(get_loaded_extensions())))))!=null)
$istanza= myFastCachedAutoloader::get_Istanza($percorso);
else $istanza= myCachedAutoloader::get_Istanza($percorso);
$istanza->set_debug(self::$modalita);
$istanza->auto_refresh((self::$modalita?0:1));
}
$istanza->add_percorso(dirname(__FILE__),array(),2,0);
return $istanza;
}
}
?>