Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/08/2008, 19:34
Avatar de Nemutagk
Nemutagk
Colaborador
 
Fecha de Ingreso: marzo-2004
Ubicación: México
Mensajes: 2.633
Antigüedad: 20 años, 1 mes
Puntos: 406
Mensaje duda sobre instanciar una clase dentro de otra

Que tal queridos compañeros foreros, tengo una duda que seguro ustedes sabran responder, y de antemano agradesco toda ayuda.

Tengo el siguiente esquema, tengo 3 clases, la clase A es la encargada de hacer la conexion a la db asi como los select, insert, etc, la clase B se encarga de pedirle a la clase a informacion de la db, la clase C se encarga de crear objetos en html para la plantilla (vista), ok, ahora, la clase B hereda de la clase A mediante Singleton.

ahora la clase C se encarga de crear un select con información que me puede proporcionar la clase B, mi pregunta es si esta correcto que dentro de la case C instancie la clase B o si es mejor pasar esa informacion como parametro, ejemplo

clase A
Código PHP:
class IOMConnect {
    
//variables de configuracion
    
private static $instances = array();
    private 
$conexion;                //Guarda la conexion activa a mysql
    
    
public static function getInstance($class) {
        if (!isset(
self::$instances[$class])) {
            
self::$instances[$class] = new $class();
        }
    
        return 
self::$instances[$class];
    }
    
    public function 
setConexion($server,$user,$pass,$db) {
        
$this->conexion mysql_connect($server,$user,$pass) or $this->getError('Error en la conexión');
        
mysql_select_db($db,$this->conexion);
    }
    
    private function 
getQuery($sql) {
        
$query mysql_query($sql,$this->conexion) or $this->getError('Error en ejecutar la sentencia \''.$sql.'\'');
        return 
$query;
    }
    
    public function 
getSelect($tabla,$campos,$addsql='') {
        
$sql 'select ';
        
        if (
is_array($campos)) {
            
$sql .= implode(',',$campos);
        }else {
            
$sql .= $campos;
        }
        
        
$sql .= ' from '.$tabla;
        
        if (!empty(
$addsql)) {
            
$sql .= ' '.$addsql;
        }
        
        return 
$this->getQuery($sql);
    }
   
    
//la clase original incluye mas metodos

clase B
Código PHP:
<?php
//clase iomgalaxy
class planetas extends IOMConnect {
    
//variables de uso interno
    
    
public function __construct() {
        
$this->setConexion('localhost','iomgalaxy','','iomgalaxy');
    }
    
    public static function 
getInstance() {
        return 
parent::getInstance(get_class());
    }
    
    
//========================================================================
    
        //Metodos de acceso a datos
    
    //========================================================================
    
    /**
    *    Metodo:     getPlanetas
    *    Funcion:     Recupera y envia los planetas creados de la DB
    *    Variable:     $id integer
    *                $campos    array
    *    Acceso:     public
    *    Entrega:     array
    */
    
public function getPlanetas($id='',$campos=array('id','planeta')) {
        
//verifico si se incluyo un ID
        
if (empty($id)) {
            
//Solicito los planetas a la base de datos
            
$planet $this->getSelect('iomg_planet',$campos);
        }else {
            
//Solicito el planeta indicado
            
$planet $this->getSelect('iomg_planet',$campos,'where id = \''.$this->getSanitizar($id).'\'');
        }
        
//entrego el array obtenido
        
return $planet;
    }
    
    
/**
    *    Metodo:        getPlanetasUsuario
    *    Funcion:    Busca y entrega el ID de los planetas que tiene el usuario
    *    Variables:    $id    integer
    *    Acceso;        public
    *    Entrega:    array
    */
    
public function getPlanetasUsuario($id) {
        
//pido los planetas a cargo del ID del usuario entregado
        
$planetas $this->getSelect('iomg_planet','id','where id_user = \''.$this->getSanitizar($id).'\'');
        
//entrego el array con los planetas
        
return $planetas;
    }
    
    
/**
    *    Metodo:        getPlanetaRecursos
    *    Funcion:    Entrega información sobre los recursos del planeta
    *    Variables:    $id    integer
                    $recursos string
    *    Acceso:        public
    *    Entrega:    array
    */
    
public function getPlanetaRecursos($id,$recursos='all') {
        
//verifico si se regresaran todos los recursos o solo alguno de ellos
        
if ($recursos == 'all') {
            
//si son todos hago la consulta de los recursos
            
$planeta $this->getSelect('iomg_planet',array('metal','cristal','uranio'),'where id = \''.$this->getSanitizar($id).'\'');
        }else {
            
//si no son todos solo recupero lo necesario
            
$planeta $this->getSelect('iomg_planet',$recursos,'where id = \''.$this->getSanitizar($id).'\'');
        }
        
//entrego la información solicitada
        
return $planeta;
    }
    
    
/**
    *    Metodo;        getPlanetaInfo
    *    Funcion:    Entrega información sobre el planeta solicitado
    *    Variables:    $id    integer
                    $campos dinamic    array|string
    *    Acceso:        public
    *    Entrega:    array
    */
    
public function getPlanetaInfo($id,$campos='*') {
        
//obtengo la información del planeta solicitado
        
$planeta $this->getSelect('iomg_planet',$campos,'where id = \''.$this->getSanitizar($id).'\'');
        
//entrego la info
        
return $planeta;
    }
}
?>
Y finalmente la clase C

Código PHP:
<?php
//clase iomgalaxy
class html extends IOMConnect {
    
//variables de uso interno
    
private $obj_planetas;        //guarda el objeto planetas
    
    
public function __construct() {
        
$this->setConexion('localhost','iomgalaxy','','iomgalaxy');
        
$this->obj_planetas planetas::getInstance(); //Aqui inicio la clase B
    
}
    
    public static function 
getInstance() {
        return 
parent::getInstance(get_class());
    }
    
    
/**
    *    Metodo:        getSelectPlanet
    *    Funcion:    Crea un select con la información de los planetas
    *    Variables:    $id    integer
    *    Acceso:        public
    *    Entrega:    string
    */
    
public function getSelectPlanet($id) {        //obtengo los planetas
        
$planetas $this->obj_planetas->getPlanetasUsuario($id); //Aqui es donde obtengo información de la clase B
        //creo el contenedor y agrego los primeros valores del select
        
$html '<form name="form" id="form"><select name="jumpMenu" id="jumpMenu" onchange="MM_jumpMenu(\'parent\',this,0)">';
        
//recorro el array y guardo el valor en $html
        
while($row=$this->getFetchAssoc($planetas)) {
            
$planeta $this->obj_planetas->getPlanetaInfo($row["id"],array('id','planeta')); //Y aqui de nuevo obtengo información de la clase B
            
$rew $this->getFetchAssoc($planeta);
            
$html .= '<option value="planel.php?planet='.$rew["id"].'">'.$rew["planeta"].'</option>';
        }
        
//ingreso lo final
        
$html .= '</select><input type="submit" name="button" id="button" value="Ir" /></form>';
        
        
//finalemnte entrego todo finalizado
        
return $html;
    }
}
?>
Entonses mi duda es que si lo que estoy haciendo esta bien o es mejor pasarle la informacion que proporciona la clase B mediante parametros a la clase C
__________________
Listo?, tendría que tener 60 puntos menos de IQ para considerarme listo!!!
-- Sheldon Cooper
http://twitter.com/nemutagk
PD: No contestaré temas vía mensaje personal =)