Foros del Web » Programando para Internet » PHP »

arreglos de objetos

Estas en el tema de arreglos de objetos en el foro de PHP en Foros del Web. Hola, estoy intentando hacer un cargador de "plugins" al estilo codeigniter para lo cual en mi controlador base hago lo siguiente: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código PHP: ...
  #1 (permalink)  
Antiguo 01/08/2010, 16:59
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
arreglos de objetos

Hola,
estoy intentando hacer un cargador de "plugins" al estilo codeigniter para lo cual en mi controlador base hago lo siguiente:
Código PHP:
Ver original
  1. abstract class Controller {
  2. protected $Librerias = array();
  3. protected $Config;
  4. public function __construct() {
  5.         //creo una instancia de la configuración
  6.         $this->Config = Config::singleton();
  7. }
  8. public function libreria($nombre) {
  9.         if(empty($nombre)) {
  10.         return false;
  11.         }
  12.         if(is_array($nombre)) {
  13.         foreach($nombre as $plugin) {
  14.             //valido si existe el archivo de la libreria
  15.             if(!empty($plugin)) {
  16.             if(file_exists($this->Config->get('root').$this->Config->get('librerias').ucfirst($plugin).'.php')) {
  17.                 //valido si no esta instanciada la clase previamente
  18.                 if(!class_exists($plugin)) {
  19.                 include_once($this->Config->get('root').$this->Config->get('librerias').ucfirst($plugin).'.php');
  20.                 $this->Librerias[$plugin] = new $plugin();
  21.                 }
  22.                 else {
  23.                 $this->Librerias[$plugin] = $plugin;
  24.                 }
  25.  
  26.             }
  27.             else {
  28.                 $ruta = $this->Config->get('root').$this->Config->get('librerias').ucfirst($plugin).'.php';
  29.                 error_log("No se encuentra la libreria: {$plugin} en {$ruta}- ".date("F j, Y, G:i")."\n", 3,$this->Config->get('root').'/errores.log');
  30.                 trigger_error("No se encuentra la libreria: {$plugin} en {$ruta}<br/>",E_USER_NOTICE);
  31.                 return false;
  32.             }
  33.             }
  34.         }
  35.         }
  36.         else {
  37.         //valido si existe el archivo de la libreria
  38.         $nombre = ucfirst($nombre);
  39.         if(file_exists($this->Config->get('root').$this->Config->get('librerias').ucfirst($nombre).'.php')) {
  40.             //valido si no esta instanciada la clase previamente
  41.             if(!class_exists(ucfirst($nombre))) {
  42.             include_once($this->Config->get('root').$this->Config->get('librerias').ucfirst($nombre).'.php');
  43.             $this->Librerias[$nombre] = new $nombre();
  44.             }
  45.             else {
  46.             $this->Librerias[$nombre] =$nombre;
  47.             }
  48.  
  49.         }
  50.         else {
  51.             $ruta = $this->Config->get('root').$this->Config->get('librerias').ucfirst($nombre).'.php';
  52.             error_log("No se encuentra la libreria: {$nombre} en {$ruta} - ".date("F j, Y, G:i")."\n", 3,$this->Config->get('root').'/errores.log');
  53.             trigger_error("No se encuentra la libreria: {$nombre} en {$ruta}<br/>",E_USER_NOTICE);
  54.             return false;
  55.         }
  56.         }
  57.         return $this->Librerias;
  58.     }
  59. }

hasta ahi todo de maravillas, si yo despues en algun controlador quiero usarlo uso algo asi:
Código PHP:
Ver original
  1. public function index() {
  2.         if(!$this->Session->get('admin') || $this->Session->get('admin')=='admin') {
  3.             $data['mensaje']['mensaje']="No estas logueado";
  4.             $data['mensaje']['tipo']="attention";
  5.             $this->Vistas->show('login.html',$data);
  6.         }
  7.         else {
  8.             $data['breadCrumb']=$this->BreadCrumb->listarBreadCrumb($_REQUEST);
  9.             $data['fila']=$this->Librerias['prueba']->hola();
  10.             $this->Vistas->show('index.html',$data);
  11.         }

y me duelve en $data['fila'] "Hola mundo".

Bien mi consulta es como puedo hacer para que en vez de tener que llamar a las "librerias" de esta forma:
Código PHP:
Ver original
  1. $this->Librerias['prueba']->hola();

pueda llamarlas asi:
Código PHP:
Ver original
  1. $this->prueba->hola();

Espero que se haya entendido mi duda y desde ya muchas gracias
  #2 (permalink)  
Antiguo 01/08/2010, 17:45
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: arreglos de objetos

Podrías usar extract para que logres lo que deseas. O si quieres puedes en vez de almacenar los valores dentro de un arreglo, puedes almacenarlo directamente al valor, es decir
Código PHP:
Ver original
  1. $this->prueba = 'valor';
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 01/08/2010, 20:25
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: arreglos de objetos

Hola, perdón si no me detengo a leer todo el código pero, viendo el objetivo que se quiere conseguir, pregunto: ¿no te sirve el método mágico __get()?. Con ello accedes al índice del arreglo y regresas la instancia de la que haces referencia.

Ejemplo consiguiendo lo mismo (aunque en la práctica difieran. Repito: no veo con detenimiento el código)
Código PHP:
Ver original
  1. <?php
  2.  
  3. class Bar
  4. {
  5.     public function metodoBar()
  6.     {
  7.         echo 'Método de Bar';
  8.     }
  9. }
  10.  
  11. class Foo
  12. {
  13.     protected $_objetos = array();
  14.  
  15.     public function __construct()
  16.     {
  17.         $this->_objetos['prueba'] = new Bar();
  18.     }
  19.  
  20.     public function __get($instancia)
  21.     {
  22.         return $this->_objetos[$instancia];
  23.     }
  24.  
  25.     public function imprimeBar()
  26.     {
  27.         $this->prueba->metodoBar();
  28.         // En lugar de
  29.         // $this->_objetos['prueba']->metodoBar();
  30.     }
  31. }
  32.  
  33. $foo = new Foo();
  34. $foo->imprimeBar();
__________________
I ♥ The Music!

Última edición por maturano; 02/08/2010 a las 17:12 Razón: Corrijo typo en código
  #4 (permalink)  
Antiguo 02/08/2010, 17:17
Avatar de destor77  
Fecha de Ingreso: noviembre-2004
Ubicación: Gálvez, Santa Fe, Argentina
Mensajes: 2.654
Antigüedad: 19 años, 5 meses
Puntos: 43
Respuesta: arreglos de objetos

Cita:
Iniciado por abimaelrc Ver Mensaje
Podrías usar extract para que logres lo que deseas. O si quieres puedes en vez de almacenar los valores dentro de un arreglo, puedes almacenarlo directamente al valor, es decir
Código PHP:
Ver original
  1. $this->prueba = 'valor';
entiendo lo que me dices, pero que pasaría cuando se cargan mas de una libreria por ejemplo:
Código PHP:
Ver original
  1. $this->librerias(array('images','upload','prueba'));
  #5 (permalink)  
Antiguo 02/08/2010, 18:15
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: arreglos de objetos

La mejor forma es la que te indicó maturano. Trata esa forma para que puedas lograrlo. Es solo un método mágico adicional, este toma la información y lo llama como comúnmente se haría.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos

Etiquetas: arreglos, objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 21:32.