Comunidad de diseño web y desarrollo en internet online

autoload en el FrontController

Citar            
MensajeEscrito el 24 Ago 2010 02:17 pm
Acabo de escribir una función autoload en mi FronController. Pero aún no se como implementarla correctamente!

Tengo también una función que lee todos los directorios, buscando clases y las almacena en un array.

Como es que pueden hacer uso de estas funciones los objetos controladores, las vistas, etc?

Código PHP :

Class FrontController {
    
   var $classes;  
   
   public function __construct(){ 
      ...
      $this->searchClasses( $APP_LOCAL_PATH );
   }
   
   ...
   
   public function __autoload($class){

      if (in_array($class.".php", $classes)) 
         require_once $class.".php";   
   }
   
   private function searchClasses($dir){
      
      $puntos = array('.', '..');
      $list = array_diff(scandir($dir), $puntos);

      foreach ($list as $item)
      {
         if (is_file($dir.$item))
            $this->classes[] = dirname($item).$item;
         elseif (is_dir($dir.$item))
            $this->searchClasses($dir.$item."/");
      }   
   }   
}     


Por lo que veo en tutoriales y en el manual, la función no debería estar incluída en un objeto. Es así?

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 24 Ago 2010 03:23 pm
Siendo que los ejemplos no usan un objeto para definir la función __autoload, tampoco lo hago yo. Acabo de escribir un archivo config con autoload que funciona.

Código PHP :

<?php

   $classes;  
   
   defineConstants();
   searchClasses( APP_LOCAL_PATH );

   function defineConstants(){ 
      
      /*** ABSOLUTE REMOTE PATH **********************/
      
      // If moving to another server, we must update this!
      if (strpos($_SERVER["HTTP_HOST"], "localhost") !== false){
         define('APP', 'http://localhost/AoI/AoITutorials/web/../application/');
         define('WEB', 'http://localhost/AoI/AoITutorials/web/'); // localhost for development
      }
      else {   
         define('APP', 'http://www.artofillusion.com.ar/application/');
         define('WEB', 'http://www.artofillusion.com.ar/AoITutorials/');
      }
      
      // fix for domain and subdomain issue: aoi-castellano / artofillusion.com.ar
      if (strpos($_SERVER["HTTP_HOST"], "castellano") !== false){
         header("Location: ".WEB);  // redirect.
      };
      
      /*** LOCAL PATH **********************/
      define('WEB_LOCAL_PATH', dirname(__FILE__)."/../web/");
      define('APP_LOCAL_PATH', dirname(__FILE__)."/"); 
      define('APP_LIB', APP_LOCAL_PATH.'Library/');   

      // html <head> related constants (absolute path)
      define('LIBRARY_DIR', 'Library/');
      define('LINK_CSS', 'Library/styles/');
      define('IMG_DIR', 'Library/images/');
            
      // html <body> related constants (for including ui images, etc)            
      define('CONTROLLERS', APP_LOCAL_PATH.'controllers/');
      define('TEMPLATES', APP_LOCAL_PATH.'templates/');         
      define('LIBRARY', WEB_LOCAL_PATH.'Library/'); 
      define('CSS_DIR', LIBRARY.'styles/');
   
   }
   
   function __autoload($class){
      
      global $classes;

      if (array_key_exists($class.".php", $classes)) 
         require_once $classes[$class.".php"];   
   }
   
   function searchClasses($dir){
      
      global $classes; 
      
      $puntos = array('.', '..');
      $list = array_diff(scandir($dir), $puntos);

      foreach ($list as $item)
      {
         if (is_file($dir.$item) and (strpos($item,".php") !== false))
            $classes[$item] = realpath($dir)."\\".$item;
         elseif (is_dir($dir.$item) and ($item != "Library") and ($item != "templates"))
            searchClasses($dir.$item."/");         
      }   
   }   
  
?>

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 24 Ago 2010 07:10 pm
Lee sobre glob

No se si ya resolviste tus dudas con autoload, si aun tienes comentalas...

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 26 Ago 2010 01:48 pm
Gracias! Me funciona declarar __autoload siempre y cuando no encapsule la función en un objeto. Pero tengo dudas. Vi que hay gente que declara un objeto autoLoad. Pero como funciona? También vi que se usa una funcion autoload sin el prefijo "__". Ese tipo de función no es llamado "magicamente", no?

Por mayid

17 de clabLevel



 

opera
Citar            
MensajeEscrito el 26 Ago 2010 03:16 pm
Ok, lo que pasa es que puedes registrar funciones callback(mira que uso plural) como autoloads con spl_autoload_register, por supuesto existe su contraparte spl_autoload_unregister.

Mira esto:

Código PHP :

<?php

class MyAutoload
{
   public static function autocarga($classname)
   {
      echo __METHOD__. " intentando cargar $classname <br />";
   }
}

function autocarga2($classname)
{  
   echo __FUNCTION__ . " intentando cargar $classname <br />";
}

function autoload($classname)
{  
   echo __FUNCTION__ . " intentando cargar $classname <br />";
}

spl_autoload_register(array("MyAutoload", "autocarga"));
spl_autoload_register("autocarga2");
spl_autoload_register("autoload");



new MiClase();

?>


Pero lee la documentación para más detalles y opciones.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.