Foros aprenderaprogramar.com
Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: gatoher en 20 de Abril 2016, 11:45
-
Estoy viendo un metodo para cargar varias clases simultáneamente con PHP, estoy haciéndolo asi:
spl_autoload_register(function($class){
$class = str_replace("..", "", $class);
require_once("validar/$class.php");
});
Así funciona perfectamente pero las clases están en el mismo directorio. A mi me gustaría que estuvieran en directorios distintos por el tema de orden. Estoy wampServer Windows y intento:
spl_autoload_register(function($class){
$class = str_replace("..", "", $class);
set_include_path('.;validar;entidades');//los dos directorios donde tengo los archivos
require_once("validar/$class.php");
});
Pero me da error.
-
Encontre la solución pero a medias. A ver haciendolo asi funciona y carga las clases:
spl_autoload_register(function($class){
$class = str_replace("..", "", $class);
set_include_path('.;validar;.;entidades');
require_once("/$class.php");
//throw new Exception("Imposible cargar $class.");
});
La excepcion esta comentada por que me salta. Tengo en una carpeta una clase validar y una interfaz llamada interfazValidar. La clase validar implementa esta interfaz. Cual puede ser el motivo si los dos archivos estan en el mismo directorio.
-
Hola! Quizás te resulte útil este código que en teoría te permite rescatar todas las clases de todos los directorios a partir del raíz (recursivamente recorriendo todos los directorios a partir del especificado en $dir = '/path/to/project' ; )
spl_autoload_register( 'autoload' );
/**
* autoload
*
* @author Joe Sexton
* @param string $class
* @param string $dir
* @return bool
*/
function autoload( $class, $dir = null ) {
if ( is_null( $dir ) )
$dir = '/path/to/project';
foreach ( scandir( $dir ) as $file ) {
// directory?
if ( is_dir( $dir.$file ) && substr( $file, 0, 1 ) !== '.' )
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;
}
}
}
}
Saludos!
-
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.
-
Hola!
throw new Exception("Imposible cargar $class."); lo que hace es lanzar una excepción. Una excepción normalmente se lanza después de comprobar que algo no va bien, y esa comprobación se hace utilizando un if (condicional para detectar que hay una condición no válida, error o excepción). No veo que tengas un if antes del throw, entonces siempre te lanzará una excepción ::)
Saludos!
-
Hola Cesar,he estado unos días fuera por eso he respondido. Si a ver, ya he visto que falta el if, el copia y pega :-\ .
El error estaba que no había puesto el include_once en la clase validaForm.
Muchas gracias