Foros del Web » Programando para Internet » PHP »

POO y base de datos

Estas en el tema de POO y base de datos en el foro de PHP en Foros del Web. Estoy haciendo una classe sencilla para empezar a programar orientado a objetos, y se me ha planteado una duda: Cómo hacer una funcion insertar_generica recoja ...
  #1 (permalink)  
Antiguo 16/02/2004, 15:50
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 3 meses
Puntos: 0
POO y base de datos

Estoy haciendo una classe sencilla para empezar a programar orientado a objetos, y se me ha planteado una duda:

Cómo hacer una funcion insertar_generica recoja las propiedades del objeto para hacer el insert?
Código PHP:
class piso extends generica{
var 
identificador;
var 
precio;

// Constructor
function piso($id,$price) {
    
$this->identificador $id;
    
$this->precio $price;
}

// Insertar
function insert() {
     return 
insertar_generica('tabla_piso',$this);
}

// Update
function update() {
     return 
modificar_generica('tabla_piso',$this);
}
-------------------------------------------------------------
class 
zapato extends generica{
var 
identificador;
var 
num_pie;

// Constructor
function zapato($id,$num) {
    
$this->identificador $id;
    
$this->num_pie $num;
}

// Insertar
function insert() {
     return 
insertar_generica('tabla_zapato',$this);
}
---------------------------------------------------------------
class 
generica{

function 
insetar_generica($table,$object);
    
$prop_object implode (',',$object);
    
$sql "INSERT INTO $table VALUES $prop_object";
    return 
mysql_query($sql);
}

function 
modificar_generica($table,$object);
    
$prop_object implode (',',$object);
    
$sql "UPDATE $table SET $prop_object WHERE id=$object->identificador";
    return 
mysql_query($sql);
}

Esta bien planteado el ejemplo?
El problema que tengo es en $pop_objeto en que tendria las propiedades del objeto.
  #2 (permalink)  
Antiguo 16/02/2004, 15:59
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 7 meses
Puntos: 0
Quizá te venga bien "darle la vuelta al problema" (no quiero decir que tu forma de verlo sea incorrecta, pero yo lo haría de otra manera). Yo tengo una clase DbConnection con métodos como los tuyos: insert, update, select, delete y close.
el funcionamiento se puede resumir así, aunque hay muchas formas de mejorarlo (sobre todo implementando iteradores!!!!):

Código PHP:
//éste es el objeto q vas a meter en la BD
$zapato =& new Zapato();
$zapato -> setTalla(42);
$zapato -> setColor('Rojo');
$zapato -> setId(0);

$con =& new DbConnection();
$con -> setTable('estanteria');
$con -> insert$zapato );
$con -> close(); 
Cómo lo ves? Me voy a cenar, ya seguimos discutiendo.
  #3 (permalink)  
Antiguo 16/02/2004, 16:03
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 21 años, 10 meses
Puntos: 16
Hola,

Mas bien no. Si estas usando herencia, lo normal es que llames a la funcion del padre directamente, con el $this->funcion generica.

Quizas te interesa leer http://www.phppatterns.com/index.php...leview/25/1/1/ (o en general www.phppatterns.com).

Saludos.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #4 (permalink)  
Antiguo 16/02/2004, 16:31
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 3 meses
Puntos: 0
Lo veo bien, es enfocandolo de otra manera. Bueno te haré unas cuantas consultas pq no estoy familiarizado con POO.

1. Pq se tiene que usar &? yo no lo pongo.
2. Estas insetando un zapato en la tabla estanteria. No seria mejor:
$con -> insert ( $zapato -> getTabla());
Así no tendrias que saber el nombre de la tabla.
3. Cómo se hace el insert este con 5 objetos diferentes mas.
( tendras que hacer 5 switch, no?).
4. Cómo extraer las propiedades de $zapato en el objeto $con, para hacer el insert?

En cuanto a mi ejemplo de código, cómo extraer las propiedades del objeto en la classe generica?

Un saludo
  #5 (permalink)  
Antiguo 16/02/2004, 17:05
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 7 meses
Puntos: 0
1. el uso de & es para crear referencias a objetos, si no lo usas cada vez que realices una asignación harás una copia de todo el objeto. Es interesante, que SIEMPRE la uses.
Código PHP:
$obj =& new Objeto();
$obj1 =& $obj;
//obj1 y obj son referencias al mismo objeto 
También ojete en las funciones que devuelven y/o reciben objetos:
Código PHP:
//ésta recibe un objeto por parámetros
function insert( &$objeto ){
...
}
//ésta devuelve un objeto
function &getAccion$nombre ){
   return new 
Accion$nombre );

2. No, por que luego si quiero manejar otra tabla con el mismo objeto sólo tengo que decírselo. Además, un zapato no tiene porqué saber dónde lo guardas.

4. (aplicable a tu clase en genérica?) en serio que me estás preguntando eso??
Extraer las propiedades mediante métodos "getNombreAtributo". (Aunque puedes acceder al atributo directamente, pero yo eso lo puse en un examen en primero de carrera y me tragué un sermón del profe porque mi respuesta violaba el principio de la encapsulación/ocultación de datos, razón que tenía!!)
Código PHP:
class Zapato {
  var 
$color;

  function 
getColor(){
    return 
$this->color;
  }

3. cinco switch? pa qué? Obviamente todos los objetos que vayas a insertar en la base de datos tienen que seguir unas reglas, para que luego tú puedas extraer la informaciń de ellas. (los métodos get/set son una de ellas x ej.)
Me podría extender más, pero casi que te lees el patrón DAO (Data Abstraction Object) de los links que te dio josemi.

un saludete, ya cuentas algo nuevo por aqui.
  #6 (permalink)  
Antiguo 16/02/2004, 17:44
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 3 meses
Puntos: 0
No entiendo cómo implementarias el metodo insert del objeto con!
En cuanto a mi ejemplo de código, cómo extraer las propiedades del objeto en la classe generica?
  #7 (permalink)  
Antiguo 16/02/2004, 18:22
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 7 meses
Puntos: 0
qué propiedades?! tu clase genérica no tiene atributos de clase!!!

En cuanto a la implementación del insert:
http://es2.php.net/manual/en/functio...bject-vars.php
http://es2.php.net/manual/en/functio...ss-methods.php
http://www.php.is/is_subclass_of (te vendría bien si todos los objetos de la base de datos extienden de una interfaz en común, o clase abstracta).
  #8 (permalink)  
Antiguo 16/02/2004, 20:19
 
Fecha de Ingreso: enero-2004
Mensajes: 235
Antigüedad: 20 años, 3 meses
Puntos: 0
Entonces este seria el resultado

class generica{

function insetar_generica($table,$object);
$prop_object = get_object_vars ($object);
$values = implode (',',$prop_object);
$sql = "INSERT INTO $table VALUES $values";
return mysql_query($sql);
}

Es que no sabia cómo coger los atributos del objeto piso si la funcion que uso para hacer el insert es de la classe generica.

Ahora lo veo, que usando get_object_vars, ya tengo acceso a los atributos del objeto que es accesible desde otra classe. Esto viola el encapsulamiento?

Muchas gracias por tus mensajes, me han sido de mucha ayuda.
En serio, gracias.. estoy aprendiendo.
  #9 (permalink)  
Antiguo 17/02/2004, 06:30
Avatar de vitxo  
Fecha de Ingreso: septiembre-2003
Ubicación: Valencia
Mensajes: 219
Antigüedad: 20 años, 7 meses
Puntos: 0
Pues no sé si termina de violar el "principio de las narices". El "error" está cuando haces esto:
Código PHP:
$zapato =& new Zapato();
$zapato -> color;
$zapato -> talla
en vez de esto:
Código PHP:
$zapato =& new Zapato();
$zapato -> getColor();
$zapato -> getTalla(); 
Pero bueno, si funciona me alegro. Aunque haya otras formas de aplicar polimorfismo a este problema en particulaar (léase DAO).

un saludete.
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 05:56.