Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Usar un Objeto dentro de otro Objeto

Estas en el tema de Usar un Objeto dentro de otro Objeto en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Que tal gurus, me surgio un problemita que les comento a continuacion: Tengo un clase, que se encarga de conectarse a la base de datos ...
  #1 (permalink)  
Antiguo 28/02/2006, 10:58
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Usar un Objeto dentro de otro Objeto

Que tal gurus, me surgio un problemita que les comento a continuacion:

Tengo un clase, que se encarga de conectarse a la base de datos y realizar las consultas SQL, la misma es Db()

Y tengo la siguiente clase, en la cual necesito obviamente crear un objeto para manejar los datos con la BD, es la siguiente

Código PHP:
<?php

include('database.php');
class 
comercios
{
    var 
$conexion;//Retorna 1 resultado para trabajar con mysql_fetch...mysql_num...mysql_assoc
    
var $izq;
    var 
$datos;
    var 
$db;
    function 
comercios()
    {
        
$db = new Db();
        
$sql="SELECT campo FROM tabla WHERE indexar='1'";
        
$this->conexion=$db->consulta_db($sql);
        return 
$this->conexion;
    }
    
    function 
listar()
    {   
//MUESTRA LISTA EN HTML
        
$this->ordenar();
        if (empty(
$this->datos)) 
        {
            echo 
"NO HAY REGISTROS AÚN";// Editar Mensaje Por inexistencia de categorias
        
}
        else
        {
            echo 
"hay registros";
            
$datos=explode('-',$this->datos);
            
$coli=$datos[0];//Cantidad de filas de Izquierda
            
$cold=$datos[1];//Cantidad de filas de Derecha
            
$sql="SELECT campo FROM tabla WHERE indexar='1' Order by rubro Asc limit 0,1";
            
$this->db->
        }
                
    }
    
    function 
ordenar()
    {   
//Calcula categoria para armar matriz de 2 por x
        
$rubros=mysql_num_rows($this->conexion);
            
//$rubros=9;
        
if ($rubros!=0
        {
              
$division=$rubros/2;
              
$res=explode(".",$division);
            if (
strchr($division,'.')) //Funcion para determinar si sumar o no 1 a la parte izquierda
            
{
                
$izq=$res[0]+1;    
            }
            else 
            {
                
$izq=$res[0];
            }
            
$der=$rubros-$izq;
            
$this->datos=$izq."-".$der;
            return 
$this->datos;
        }        
    }
    
}
?>

Bueno la cosa es que en el método listar (), necesito hacer otra consulta a labase de datos, en realidad 2
Pero quiero saber si ha alguna forma de evitar crear un objeto a la base de datos para cada método que la necesite, o si puedo crear un solo objeto y trabajarlo en todos los metodos que quiera, en este ultimo caso, como lo podría hacer?

Desde ya muchas gracias
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #2 (permalink)  
Antiguo 28/02/2006, 11:42
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Bueno, escribo porque he encontrado la solucion, o bueno una solucion por el momento quenos e si será la mas optima, a mi clase comercio, la hago extendida de mi clase Db

Class comercios extends Db


Y para usar una sola conexion, en el constructor, hago el llamado al constructor de la clase Db que es en la que se conecta a MySql con
$this->Db();

Espero se me entienda, y si alguien quisiera verlo de mejor manera no dude en preguntar asi posteo, pasa que estoy en el trabajo ahora.
Saludos-
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #3 (permalink)  
Antiguo 05/03/2006, 16:13
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
Cita:
Iniciado por Znet
Bueno, escribo porque he encontrado la solucion, o bueno una solucion por el momento quenos e si será la mas optima, a mi clase comercio, la hago extendida de mi clase Db

Class comercios extends Db


Y para usar una sola conexion, en el constructor, hago el llamado al constructor de la clase Db que es en la que se conecta a MySql con
$this->Db();

Espero se me entienda, y si alguien quisiera verlo de mejor manera no dude en preguntar asi posteo, pasa que estoy en el trabajo ahora.
Saludos-
Una mejor solucion es usar el patron singleton puede echarle un vistazo en la siguiente direccion http://www.phptr.com/articles/articl...01193&seqNum=2 o en http://www.phppatterns.com/docs/desi...gleton_pattern
__________________
Saludos!
Mty-NL..
  #4 (permalink)  
Antiguo 05/03/2006, 17:00
 
Fecha de Ingreso: marzo-2002
Ubicación: Salta Capital - Actualmente estudiando en Córdoba
Mensajes: 430
Antigüedad: 22 años, 1 mes
Puntos: 0
Muy buenos links, pero a decir verdad, no entiendo nada, es muy avanzada ese tipo de programación. Si pudises expicar con algun otro ejemplo por ahi quedaría mas claro, o tal vez con alguna situacion mas practica.
Saludos.
__________________
Nada es imposible, con un poco de esfuerzo se logran las cosas.-
  #5 (permalink)  
Antiguo 07/03/2006, 19:22
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
Ok, aqui va una explicacion no oficial de lo que es el singleton y como funciona. espero que te sirva de referencia rapida.
Propósito:
Garantiza que una clase tenga una instancia, y proporciona un punto de acceso global a ella.
En tu caso, tienes una clase que gestiona las operaciones con tu RDBMS. Y como comentas tu necesidad es que las clases que usan dicho objeto, puedan acceder a una sola instancia de la misma para no estar creado nuevas conexiones en cada llamada al objeto. Bien veremos con un ejemplo sencillo como podemos resolver eso con el patrón singleton.

Estructura:
El patrón en términos de UML puede lucir como sigue

Si te das cuenta la clase implementa un método que nos permite obtener una sola instancia, mediante un llamado de la clase así si misma, veamos ahora con un ejemplo sencillo en php. En el que se requiere un objeto que funcione como un registro de datos el cual pueda ser accedido de forma global por otro objetos, a la clase que implementa esta idea la he llamado SingletonLista en términos de php seria algo como sigue:

Implementación:
Código PHP:
/**
* Clase que implementa el patrón singleton
*/
class SingletonLista
{
  var 
$elemento null;
  
  function 
SingletonLista(){
    
$this->elemento = array();
  }
  
  function 
agregarElemento($elmt=null)
  {
    if (isset(
$elmt)){
      
$this->elemento[] = $elmt;
    }
    return 
false;
  }
  
  function &
unicaInstancia()
  {

    static 
$instancia null;

    if (!
is_object($instancia)){
      
$instancia = new SingletonLista();
    }
    return 
$instancia;
  }

La clase solo tiene una variable de arreglo, donde almacenara la información que le pasen las clases que la requieran, ahora para usarla creamos dos clase que solo tiene un método con el que agregan datos a la clase SingletonLista.

Código PHP:
/**
* close A
*/
class A
{
  function 
A()
  {
    
$this->lista = &SingletonLista::unicaInstancia();
  }
  
  function 
agregar($elmt)
  {
    
$this->lista->agregarElemento($elmt);
  }
}

/**
* Clase B
*/
class B
{
  function 
B()
  {
    
$this->lista = &SingletonLista::unicaInstancia();
  }

  function 
agregar($elmt)
  {
    
$this->lista->agregarElemento($elmt);
  }

Bien ahora probaremos nuestro singleton:
Código PHP:
$a =& new A();
$b =& new B();

$a->agregar('uno');
$a->agregar('dos');
$a->agregar('tres');

print_r($a);
print_r($b); 
En el ejemplo creamos dos objetos uno a, y otro b los dos tiene un metodo que agrega elementos a la lista, finalmente imprimimos los dos objetos y obtenemos lo siguiente:
Código:
a Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                )

        )

)

b Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                )

        )

)
Como puedes ver, el objeto ha sido un existo, el contenido de nuestra clase SingletonLista están disponibles para ambos objetos ahora supongamos que un momento después nuestro objeto b agrega otro elemento:
Código PHP:
$b->agregar('cinco');

print_r($a);
print_r($b); 
El resultado seria el siguiente:
Código:
a Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                    [3] => cinco
                )

        )

)
b Object
([lista] => singletonlista Object
        (
            [elemento] => Array
                (
                    [0] => uno
                    [1] => dos
                    [2] => tres
                    [3] => cinco
                )

        )

)
Y sorpresa el nuevo elemento agregado por b ahora también esta disponible para a.
Con esta idea, puedes agregar un método estático a la clase que estas usando para tratar con tu RDBMS y solucionar tu problema, también puedes retocar la clase SingletonLista y almacenar objetos únicos, pero eso lo dejamos para otra ocasión para no introducir complicaciones a la explicación.
__________________
Saludos!
Mty-NL..
  #6 (permalink)  
Antiguo 07/03/2006, 19:26
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años
Puntos: 2
recuerda que la clave es esta parte de codigo:
Código PHP:
function &unicaInstancia()
  {

    static 
$instancia null;

    if (!
is_object($instancia)){
      
$instancia = new SingletonLista();
    }
    return 
$instancia;
  } 
en nuestra clase SingletonLista observa como esta implementado el metod y es importante que este metodo devuelva una referencia a la variable static
__________________
Saludos!
Mty-NL..
  #7 (permalink)  
Antiguo 07/03/2006, 19:39
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Excelente Explicación!!!! Muchas gracias!!!!
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 02:28.