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.