Hola Cesar, he estado viendo y probando y nada. No me funciona. Te paso un script de prueba que he hecho. La parte de saber si es un directorio la comprendo, pero la parte de buscar los archivos no. A ver:
if ( substr( $file, 0, 2 ) !== '._' && preg_match( "/.php$/i" , $file ) )
La primera condición le substraes dos caracteres y compruebas que sea distinto de ('._'). Ese guión no se que hace. Y la segunda condición que buscas que empareje ("/.php$/i") No lo comprendo.
Mira te pongo el script que he hecho de prueba para que lo veas:
<body>
<?php
spl_autoload_register( 'autoload' );
function autoload( $class, $dir = null ) {
echo 'la clase es. '.$class.'<br>';//para saber lo que recive
if ( is_null( $dir ) ){
$dir = 'C:\xampp\htdocs\Proyecto-Final';
}
foreach ( scandir( $dir ) as $file ) {
// directory?
if ( is_dir( $dir.$file ) && substr( $file, 0, 1 ) !== '.' )
//Esto lo he modificado ya que estoy hacienda las pruebas en wampServer Windows
autoload( $class, $dir.$file.'\\' );
// php file?
if ( substr( $file, 0, 2 ) !== '._' && preg_match( "/.php$/i" , $file ) ) {
// filename matches class?
if ( str_replace( '.php', '', $file ) == $class || str_replace( '.class.php', '', $file ) == $class ) {
include $dir . $file;
}
}
// throw new Exception('Imposible encontrar clase');
}
}
/**
* Creamos una clase que hereda
* de la clase que nos va a permitir
* validar el formulario.
*/
class prueba extends ValidoForm {
public function __construct($a,$b){
parent::__construct($a,$b);
}
}
//try{
//Este script esta en la raiz del proyecto
//$obj es un objeto de la clase prueba que extiende a la clase ValidaForm,
//ValidaForm implementa la interfaz Interf_comprobar, Ambas estan en la ruta /validar/ValidoForm.php y /validar/Interf_comprobar.php
$obj = new prueba(array(), array());
//$objUsu; Objeto de la clase usuarios su ruta es: /entidades/Usuarios
$objUsu = new Usuarios();
// }catch (Exceptio $e){
// echo $e->getMessage()."\n";
// }
?>
</body>
Me funciona correctamente.
El metodo autoload lo tengo asi:
spl_autoload_register(function($class){
$class = str_replace("..", "", $class);
set_include_path('.;validar;.;entidades');//aqui soluciono el problema
require_once("/$class.php");
// throw new Exception("Imposible cargar $class.");
});
Funciona perfectamente, pero como ves tengo comentado el lanzador de excepción. Si lo descomento me responde:
Fatal error: Uncaught exception 'Exception' with message 'Imposible cargar Interf_comprobar.' in C:\xampp\htdocs\Proyecto-Final\index.php on line 44
Lo que me extraña es que esa interfaz esta en el mismo directorio que la clase que la implementa 'ValidoForm', que es el constructor que tengo.