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

Duda - CLASES

Estas en el tema de Duda - CLASES en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Que tal, tengo una duda hace algun tiempo que espero alguien pueda contestarme. Cuando yo creo una clase y esta necesita de otra para poder ...
  #1 (permalink)  
Antiguo 24/10/2007, 08:14
 
Fecha de Ingreso: marzo-2006
Mensajes: 19
Antigüedad: 18 años, 2 meses
Puntos: 0
Duda - CLASES

Que tal, tengo una duda hace algun tiempo que espero alguien pueda contestarme. Cuando yo creo una clase y esta necesita de otra para poder trabajar, me surge la siguiente duda:

1. Instancio la clase dentro de la que la necesita (por ejemplo instancio la clase db dentro de la clase usuario)

O

2. Lo paso como parametro en la funcion constructora de la clase que la necesita.

Algo como:
$db = new db('basededatos', 'localhost', 'usuario', 'contraseña');
$usuario =new usuario($db);

Muchas Gracias,

Topicus
  #2 (permalink)  
Antiguo 24/10/2007, 08:22
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda - CLASES

Todo depende del contexto, por ejemplo en tu caso instancias el objeto con otros datos fuera de la clase y luego la pasas a tu objeto usuario, si la instanciaras dentro de tu usuario necesitarías ahí poner los datos para la conexion, con lo que si necesitas cambiar los datos de conexión, tendrías que cambiar muchas clases.

Ahora si usas el patrón Singleton puedes instanciar tu clase desde fuera y tus clases que usan DB pueden obtener el mismo objeto y así te evitas pasarlo como parámetro y todavía tienes un control desde donde y como se instancia.

Saludos.
  #3 (permalink)  
Antiguo 24/10/2007, 09:04
 
Fecha de Ingreso: marzo-2006
Mensajes: 19
Antigüedad: 18 años, 2 meses
Puntos: 0
Re: Duda - CLASES

Entendí el primer parrafo, pero no el segundo. Es decir ¿de que forma podrian acceder a los metodos de la clase que maneja la base de datos las otras clases si no le paso el objeto db como parametro y no lo instancio dentro de las clases que lo necesitan?
  #4 (permalink)  
Antiguo 24/10/2007, 11:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda - CLASES

Con el patron singleton puedes crear una clase estatica:
Código PHP:
class User {
     public function 
algo() {
           
$db DB::getInstance();
     }

Saludos.
  #5 (permalink)  
Antiguo 24/10/2007, 21:18
 
Fecha de Ingreso: octubre-2007
Mensajes: 21
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Duda - CLASES

yo tambien queria saber como hacer eso!!

yo antes declaraba global el objeto $db adentro de la funcion de otra clase para poder ejecutarlo... pero la cosa seria

Código PHP:
class db  {
function 
Db(USER,PWD,HOT,DBNAME){

}

function 
query(){

}

}

$db = new Db(USER,PWD,HOT,DBNAME);


class 
paginacion Extends db{
function 
paginar (){
$this->query("SQL");//heredando funcion
}

}
$paginacion = new paginacion(); 
Eso deberia funcionar teorica mente pero lo que pasa es que da error es como si no se conectara ala db

aver si alguien da la mano en esto
  #6 (permalink)  
Antiguo 24/10/2007, 22:56
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Duda - CLASES

Hola,

pienso que el "cómo" depende de tu estilo de programación y diseño. Puedes usar herencia, agregación o composición y hacer que funcione. Sin embargo, la decisión que tomes definitivamente afectará la interacción entre las diferentes clases de tu sistema.

Por supuesto, el objeto de la base de datos es algo especial. xD Hoy en día hay tantos frameworks que casi parece fútil tener que "administrar" este objeto. Imagino que deben existir contextos en los que es necesario lidiar directamente con la base de datos.

oVuzZ, me parece que el problema es que no estas llamando al constructor de la clase base. Algo como parent::db(parámetros);


Saludos.
  #7 (permalink)  
Antiguo 25/10/2007, 01:57
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Re: Duda - CLASES

La pregunta original se refiere a usar un objeto dentro de una clase. Un objeto no es muy diferente a una variable. Asi que la respuesta a pasar el objeto como parametro o crearlo dentro de la clase, es lo mismo que pasar una variable como parametro o crearla: todo depende del conjunto.
  #8 (permalink)  
Antiguo 25/10/2007, 09:08
 
Fecha de Ingreso: octubre-2007
Mensajes: 21
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Duda - CLASES

ami me bota este errror cuando ejecuta elc doigo que puse arriba

Código PHP:
mysql_query(): supplied argument is not a valid MySQL-Link resource 
En la linea de la clase db

Código PHP:
$this->result mysql_query($sSql,$this->JcvID); 
k4k4 eso de parent::db(); no crees que ya declarando al principio

Código PHP:
$db = new Db(USER,PWD,HOT,DBNAME); 
deveria ser suficiente, el error que le sale es como si no hicera la conexion bueno dedusco.

pero si yo hago una consulta con.

Código PHP:
$db->query("SENTENCIA"); 
ejecuta normal, el problema se ocasiona cuando hago esto.

Código PHP:
$paginacion->query("SENTENCIA"); 

aver si alguien mas se une para ayudar.

Gracias a los que dieron sus opiniones antes.
  #9 (permalink)  
Antiguo 25/10/2007, 09:48
Avatar de k4k4  
Fecha de Ingreso: junio-2007
Ubicación: Baja California, México
Mensajes: 120
Antigüedad: 16 años, 11 meses
Puntos: 6
Re: Duda - CLASES

Hola,

efectivamente, no es necesario llamar a parent::. Esto sólo se hace cuando defines un constructor en la clase hija. xD Me equivoque.

Ahora, asegurate de estar pasando los parámetros de conexión a la bd:
Código PHP:
$paginacion = new paginacion(USER,PWD,HOST,DBNAME); 
Si todavía tienes problemas, intenta posteando el código completo.

Saludos.
  #10 (permalink)  
Antiguo 29/10/2007, 17:47
 
Fecha de Ingreso: octubre-2007
Mensajes: 21
Antigüedad: 16 años, 6 meses
Puntos: 0
Re: Duda - CLASES

ya miren mi codigo es asi
Claro las funciones son muy basicas pero para ejemplo vale

Mi Singleton
Código PHP:
<?
class Singleton {
       public static 
$config;
       private static 
$_instance null;
       
       private function 
__construct() {}
      
      public static function 
getInstance() {
               if( !
self::$_instance instanceof self ) {
                        
self::$_instance = new self();
               }

               return 
self::$_instance;
       }

       public function 
setParam($option,$value) {
              
$this->config[$option] = $value;
       }
       
       public function 
getParam($option) {
              return 
$this->config[$option];
       }
}  
?>
Mi Clase DB
Código PHP:
<?
class DB Extends Singleton{
    
    public function 
connect()    {
    
        
$obj Singleton::getInstance();
    
        
$r = &$obj->config;
            
        
extract($rEXTR_SKIP);    
        
        
$this->dbh mysql_connect($dbhost,$dbuser,$dbpwd);
        
        if ( ! 
$this->dbh ){
            echo 
"error";
        }

        
$this->select($dbname);
        
    }

    public function 
select($db){
        
mysql_select_db($db,$this->dbh);
    }
    
    public function 
query($query){
        
        
$this->result mysql_query($query,$this->dbh);
        
    }
    
}
?>
mi Index
Código PHP:
<?

include 'singleton.php';
include 
'db.php';

$obj Singleton::getInstance();

/*configuracion*/
$obj->setParam("dbuser","root");
$obj->setParam("dbhost","localhost");
$obj->setParam("dbpwd","");
$obj->setParam("dbname","wp");

$mysql DB::getInstance();

$mysql->connect();

$result $mysql->query("SELECT * FROM wp_users");

$row mysql_fetch_row($result);
    
    echo 
$row[0]; 
    echo 
$row[1]; 

?>
pero me bota este error

Fatal error: Call to undefined method Singleton::connect()

Claro Singleton no tiene la funcion connect pero yo llamo

Código PHP:
$mysql->connect(); 

otra cosa el

Código PHP:
public function connect()    {
    
        
$obj Singleton::getInstance(); 
lo puedo cambiar por

Código PHP:
public function connect()    {
    
        
$obj parent::getInstance(); 
creo ke funcionaria pero no me rula el codigo...

probe quitandole el Extends Singleton y instanciando db en ves de

Código PHP:
$mysql DB::getInstance();
//por
$mysql = new DB
pero yo quiero eredarlo no se puede?

yo pienso que es tendria que llamarlo con self pero nos e como
  #11 (permalink)  
Antiguo 29/10/2007, 23:04
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Duda - CLASES

Recuerda que Singleton es un patron de diseño, no es una clase, es un patron o sea una guia para tu hacer tus clases, si lo que quieres es agregarla a tu clase DB solo implementas el patron:
Código PHP:
class DB {
      private static 
$_instance;
      private 
$user;
      private 
$pwd;
      private 
$db;
      private 
$link;

      private function 
__construct() {
             
$config Config::getInstance();
             
$this->user $config['user'];
             
$this->pwd $config['pwd'];
             
$this->db $config['db'];
      }

      public static function 
getInstance() {
             if( !
self::$_instance instanceof self ) {
                   
self::$_instance = new self();
             }

             return 
self::$_instance;
      }

      public function 
connect() {
            
$this->link mysql_connect$this->user$this->pwd$this->db );
      }

Algo asi, puedes ver que el patron singleton esta Implicito en la clase DB.

Saludos.
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 15:40.