<?php
//require_once CORE . 'exception' . DS . 'systemexception.class.php';
$autoloadlog = '';
function search_lib($lib, $file, $ds = '/'){
// Verifica se o diretório informado é válido
global $autoloadlog;
if (is_array($lib)){
foreach ($lib as $dir) {
if ($f = search_lib($dir, $file, $ds)){
return $f;
break;
}
}
return FALSE;
}
if (is_dir($lib)){
$path = isset($path) ? $path : "";
$path = cleanPath($lib, $path, $ds);
$autoloadlog .= 'Lib: ' . (is_array($lib) ? implode(', ', $lib) : $lib) . PHP_EOL .
'File: ' . $file . PHP_EOL . PHP_EOL .
'Path: ' . $path . PHP_EOL . PHP_EOL .
(file_exists($path) ? 'EXISTS!' : 'NOT Exists!') . PHP_EOL . PHP_EOL .
str_repeat('-', 200) . PHP_EOL . PHP_EOL;
// Verifica se o arquivo já existe neste primeiro diretório
if (file_exists($path))
return $path;
// Lista os subdiretórios e arquivos
$dirs = array_diff(scandir($lib, 1), ['.','..']);
foreach ($dirs as $dir) {
// Verifica se é um arquivo se for, pula para o próximo
if (!is_dir($lib.$ds.$dir)) continue;
// Se for um diretório procura dentro dele
$f = search_lib($lib.$ds.$dir, $file, $ds);
// Caso não encontre retora FALSE
if ($f !== FALSE) return $f;
}
} else
$autoloadlog .= 'Lib "'. $lib .'" is not a dir.'.PHP_EOL.PHP_EOL;
// Se o diretório informado não for válido ou se não tiver encontrado retorna FALSE
return FALSE;
}
function cleanPath($lib, $file, $ds = '/') {
$lib = rtrim($lib, '/\\');
$path = strtolower($lib.$ds.$file);
$path = str_replace(['\\', '/'], $ds, $path);
return $path;
}
spl_autoload_register(
function ($class){
global $autoloadlog;
$libs = [BASE];
if (defined('APP'))
$libs[] = APP;
if (defined('SOURCES'))
$libs = array_merge($libs, (gettype(SOURCES) == 'array' ? SOURCES : [SOURCES]));
$ext = '.class.php';
$debug = !TRUE;
$file = FALSE;
$autoloadlog .= '<h3>'.$class.'</h3>';
foreach ($libs as $lib) {
$path = cleanPath($lib, $class.$ext, DIRECTORY_SEPARATOR);
/*
$autoloadlog .= '<pre>Lib: ' . (is_array($lib) ? implode(', ', $lib) : $lib) . PHP_EOL .
'File: ' . $class.$ext . PHP_EOL . PHP_EOL .
'Path: ' . $path . PHP_EOL . PHP_EOL .
(file_exists($lib.$class.$ext) ? 'EXISTS!' : 'NOT exists!') . PHP_EOL .
'BackTrace: ' . var_export(debug_backtrace(), true) . PHP_EOL . PHP_EOL .
str_repeat('-', 200) . PHP_EOL . PHP_EOL.'</pre>';
*/
if (file_exists($path)){
$file = $path;
break;
}
}
//$file = search_lib($libs, $class.$ext);
// Debug
if ($debug) echo $autoloadlog;
// Se encontrou inclui o arquivo
if ($file !== FALSE && is_string($file) && $file !== '') {
require_once $file;
if (!class_exists($class, FALSE)){
//trigger_error('Autoload error: File loaded, but class not found.' , E_USER_ERROR);
//throw new \Core\Exception\SystemException(\Core\Exception\Exceptions::E_CLASSNOTEXIST, [$class]);
//throw new Exception("Autoload error: File loaded, but class '{$class}' not found.");
}
} else { // Se não encontrar o arquivo lança um erro na tela. :)
if (is_array($libs)) $libs = implode($class.$ext . '</code>, <code>', $libs);
//trigger_error("Autoload error: Can't find the file {$class}{$ext} on [{$libs}]!" , E_USER_ERROR);
//throw new \Core\Exception\SystemException(\Core\Exception\Exceptions::E_FILENOTFOUND, ["<code>{$libs}".$class.$ext."</code>"]);
//throw new Exception("Autoload error: Can't find the file {$class}{$ext} on [{$libs}]!");
}
}
);
|