3 millones en foros del web

Registrarte Políticas Wiki 120segs Ayuda Iniciar sesion

Avisos

Retroceder   Foros del Web > Programación para sitios web > PHP
Respuesta
 
Herramientas Desplegado
Antiguo 16-feb-2004, 14:50   #1 (permalink)
 
235 Mensajes
jmaribau está desconectado
Cool 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.
  Responder Citando
Antiguo 16-feb-2004, 14:59   #2 (permalink)
vitxo (Reg: septiembre-2003)
 
219 Mensajes
Ubicación: Valencia
vitxo está desconectado
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.
  Responder Citando
Antiguo 16-feb-2004, 15:03   #3 (permalink)
Ex Colaborador
 
9.106 Mensajes
josemi está desconectado
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.
  Responder Citando
Antiguo 16-feb-2004, 15:31   #4 (permalink)
 
235 Mensajes
jmaribau está desconectado
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
  Responder Citando
Antiguo 16-feb-2004, 16:05   #5 (permalink)
vitxo (Reg: septiembre-2003)
 
219 Mensajes
Ubicación: Valencia
vitxo está desconectado
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.
  Responder Citando
Antiguo 16-feb-2004, 16:44   #6 (permalink)
 
235 Mensajes
jmaribau está desconectado
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?
  Responder Citando
Antiguo 16-feb-2004, 17:22   #7 (permalink)
vitxo (Reg: septiembre-2003)
 
219 Mensajes
Ubicación: Valencia
vitxo está desconectado
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).
  Responder Citando
Antiguo 16-feb-2004, 19:19   #8 (permalink)
 
235 Mensajes
jmaribau está desconectado
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.
  Responder Citando
Antiguo 17-feb-2004, 05:30   #9 (permalink)
vitxo (Reg: septiembre-2003)
 
219 Mensajes
Ubicación: Valencia
vitxo está desconectado
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.
  Responder Citando
Respuesta
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.

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code está Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado
Trackbacks está Desactivado
Pingbacks está Desactivado
Refbacks está Desactivado



La zona horaria es GMT -6. Ahora son las 08:33.
Políticas de Uso de Foros del Web


Message Board Statistics

SEO by vBSEO 3.3.2

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106