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

Pasar objeto como parametros a otras clases.

Estas en el tema de Pasar objeto como parametros a otras clases. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Me explico en el código mejor... class.db.php Código PHP: <?php class  DB {     var  $Conexion ;  //variable de conexión      var  $Consulta ;  //variable de consulta      function  DB ...
  #1 (permalink)  
Antiguo 28/08/2005, 10:37
 
Fecha de Ingreso: agosto-2005
Mensajes: 143
Antigüedad: 18 años, 8 meses
Puntos: 0
Pasar objeto como parametros a otras clases.

Me explico en el código mejor...
class.db.php
Código PHP:
<?php
class DB
{
    var 
$Conexion//variable de conexión
    
var $Consulta//variable de consulta

    
function DB() //constructor
    
{
        
$this->Conexion false;
        
$this->Consulta false;
    }

    function 
Conectar($host=_DB_HOST$user=_DB_USER$pass=_DB_PASS$db=_DB_NAME//conectar a la db
    
{
        if(empty(
$this->Conexion))
        {
            
$this->Conexion mysql_connect($host$user$pass);
            if(!
$this->Conexion)
                
trigger_error('No puede establecerse una conexión con el servidor que alberga la base de datos.'E_USER_ERROR);

            if(!
mysql_select_db($db$this->Conexion))
                
trigger_error('No puede establecerse una conexión con la base de datos.'E_USER_ERROR);
        }
        return 
$this->Conexion;
    }

    function 
Consultar($sql//realizar una consulta a la db
    
{
        if(isset(
$this->Conexion))
            
$this->Consulta mysql_query($sql$this->Conexion);

        return 
$this->Consulta;
    }

    
//mas metodos por aki
    //....
}
?>
class.user.php
Código PHP:
<?php
class User
{
    function 
User() //constructor
    
{
        
//O_O
    
}

    function 
setNewUser($user$pass$email//crear nuevo usuario
    
{
        
//valido los datos etc, etc...

        
$this->Consultar("SELECT user,email FROM "._DB_PREFIX."users WHERE user='".$user."' OR email='".$email."'");
        if(
$this->getNumRows() == 0)
        {
            if(!
$this->Consultar("INSERT INTO "._DB_PREFIX."users (user, pass, email) VALUES ('".$user."', '".$pass."', '".$email."')"))
                
trigger_error('No se ha podido crear el usuario por un error inesperado.'E_USER_ERROR);
            else
                return 
true;
        }else
            
trigger_error('No puede registrarse con ese nick/email.'E_USER_ERROR);
    }

    
//mas métodos, etc, etc...
}
?>
Lo que quiero conseguir es no tener que heredar en User la clase DB. Por que como tengo más clases que usan la base de datos quiero conseguir crear un solo objeto para manejar la base de datos y este "pasárselo" como parámetro(o de otra forma que no sea extendiendo) a las demás clases.

Me explico con un ejemplo.
Un ejemplo para crear un usuario nuevo(como yo quiero hacerlo).

Código PHP:
<?php
session_start
();
require_once(
'./config.php');

include_once(
'clases/class.db.php');
include_once(
'clases/class.user.php');
###

if(isset($_POST['registrar']))
{
    
$DB = new DB;
    
$DB->Conectar();
    
$User = new User($DB);//AKI ESTA EL PROBLEMA!!! NO SE COMO HACER ESTO!!!
    
if($User->setNewUser($_POST['user'], $_POST['pass'], $_POST['email']))
        
trigger_error('El usuario se ha registrado con éxito.'E_USER_NOTICE);

    
/* Si la clase User fuera extendida de DB y aki quiera hacer algo mas con otra clase y la base de datos, tendría que abrir otra conexion y crear otro objeto para manejar la db  y eso es lo que no quiero xD */

    
$DB->Liberar();//estan declarados en class.db.php
    
$DB->Desconectar();
}
//por aki el formulario etc, etc...
?>
Logicamente tendría que modificar el constructor de User para que "coja" ese objeto.
He probado creando dos metodos en la clase DB que devuelvan las variables de consulta y pasarselo a User como parametroa al crear el objeto pero entonces Consulta no estaba definida en User y no podía ser.


Gracias por leerme, espero haberme explicado con claridad. Y siento que sea tan extensa la explicación ;)
  #2 (permalink)  
Antiguo 28/08/2005, 10:54
 
Fecha de Ingreso: agosto-2005
Mensajes: 143
Antigüedad: 18 años, 8 meses
Puntos: 0
Holas.

Cada vez estoy más seguro de que soy un gilipollas. Ya he encontrado la solución. Pensaba que sería algo complicado pero era tan simple como pasar el objeto en sí por el constructor.

Código PHP:
<?php
class User
{
    var 
$Objeto;

    function 
User(&$objeto)
    {
        
$this->Objeto =& $objeto;
    }
    
//etc
}
?>
Despues olo así:
Código PHP:
<?php
$DB 
= new DB;
$User = new User($DB);
//etc
?>
Y en los métodos: $this->Obejto->Consultar() por ejemplo.

Saludos ;)
  #3 (permalink)  
Antiguo 28/08/2005, 11:59
Avatar de adriancid  
Fecha de Ingreso: abril-2005
Ubicación: Versalles, Santiago de Cuba, Cuba
Mensajes: 53
Antigüedad: 19 años
Puntos: 0
Si deseas tener solo una conexion a la base de datos me parece que el camino más indicado no es ese que estas siguendo aunque si funciona perfecto pero creo que lo que debes hacer es tener un implementacion del patron Singleton para que todas tus clases hereden del padre de la conexión a la base de datos pero como tal solo exista una conexión a la misma, que creo eso es lo que necesitas http://www.forosdelweb.com/showpost....5&postcount=33
  #4 (permalink)  
Antiguo 28/08/2005, 12:10
 
Fecha de Ingreso: agosto-2005
Mensajes: 143
Antigüedad: 18 años, 8 meses
Puntos: 0
Holas.

Gracias, si me funciona...pero voy a ver eso que me dado...no tenia ni idea de la existencia de algo así.

Gracias y saludos ;;)
  #5 (permalink)  
Antiguo 28/08/2005, 12:13
Avatar de adriancid  
Fecha de Ingreso: abril-2005
Ubicación: Versalles, Santiago de Cuba, Cuba
Mensajes: 53
Antigüedad: 19 años
Puntos: 0
Puedes llegarte por http://www.php.net y buscar en el manual la sección de Patrones y te enteraras de muchas más cosas que trae incorporadas el PHP5
  #6 (permalink)  
Antiguo 28/08/2005, 12:17
 
Fecha de Ingreso: agosto-2005
Mensajes: 143
Antigüedad: 18 años, 8 meses
Puntos: 0
Holas.

Gracias de nuevo, pero primero quiero dominar las clases en PHP4 y despues daré el salto a PHP5.

De aquí me surge otra duda...¿una clase programada para PHP4 funcionará en PHP5?

Saludos ;)
  #7 (permalink)  
Antiguo 28/08/2005, 12:21
Avatar de adriancid  
Fecha de Ingreso: abril-2005
Ubicación: Versalles, Santiago de Cuba, Cuba
Mensajes: 53
Antigüedad: 19 años
Puntos: 0
A mi me funcionan de lo mejor de todas formas en el manual hay una sección de como migrar de PHP4 a PHP5
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 03:55.