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

Definir un constructor correcto para una clase

Estas en el tema de Definir un constructor correcto para una clase en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas que tal? Estoy aca para pedir su ayuda, ya que me gustaria seguir mi desarrollo en buenos pasos. Tengo una clase, Tenista, en la ...
  #1 (permalink)  
Antiguo 04/11/2009, 14:00
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Definir un constructor correcto para una clase

Buenas que tal?

Estoy aca para pedir su ayuda, ya que me gustaria seguir mi desarrollo en buenos pasos.

Tengo una clase, Tenista, en la cual al constructor lo defini asi:

Código PHP:
public function __construct($id){
            
$query sprintf("SELECT * FROM tenistas WHERE id='%d'",mysql_real_escape_string($id));
            
$result mysql_query($query,$conexion) or die(mysql_error());
            if(
mysql_num_rows($result) == 1){
                
$fila mysql_fetch_object($result);
                
$this->_id $fila->id;
                
$this->_nombre $fila->nombre;
            }
        } 
Eso anda perfecto, sin embargo me surgio una duda. En el momento que yo quiera agregar un nuevo Tenista a mi base de datos, seria correcto que haga esto?

Código PHP:
$tenista = new Tenista(1);
$tenista->setNombre("Mario Araque (ARG)");
$tenista->insert(); //Esta funcion agregaria a la base de datos lo que tenga en la clase 
Seguro que funcione, lo que veo medio "cutre" es el hecho de declarar un nuevo Tenista con un id aleatorio (pudiera poner cualquier numero), solo para cambiarle el nick e insertarlo. El tenista con ID=1 no se modificaria puesto que no use la funcion update, si no insert.

Que hago mal? Mas alla de que funcione no lo veo muy lindo y siento que puede haber una mejor solucion. Creen que lo mejor es poner un constructor vacio en estos casos? Y yo completar la informacion como quiera.

Gracias por todo, de verdad.

Saludos.
  #2 (permalink)  
Antiguo 04/11/2009, 14:14
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Definir un constructor correcto para una clase

pues definitivamente la clave esta en al parámetro que recibes...

yo lo haría así:

- si se especifica un ID numérico, entonces el SELECT / se consideraría UPDATE mas adelante
- si no hay ID, entonces se considera exclusivamente INSERT

mas-o-menos así funciona el patrón ActiveRecord, sería conveniente que busques e investigues...

suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 04/11/2009, 14:32
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Definir un constructor correcto para una clase

Es interesante, acabo de leer un poco en Wikipedia (es cortito la explicacion que hacen).

Mucho no logre comprender lo de "considerar". Si yo tengo un id=0 (por decir un ejemplo), creo un tenista "Vacio" ... si tengo id!=0, creo el tenista como lo mostre en mi primer post. Pero porque tengo q "considerar"? Yo tengo tambien funciones update e insert, y puedo llamarlas segun me convenga.

Por decir un ejemplo, yo tengo el codigo ... y creo un tenista con id=0 , osea vacio. Y le seteo los valores y le llamo a la funcion insert. Eso esta mal? Es lo que no me esta terminando de cerrar de todo esto.

Saludos y gracias x la pronta respuesta.
  #4 (permalink)  
Antiguo 04/11/2009, 14:37
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Definir un constructor correcto para una clase

Cita:
Iniciado por MarioAraque Ver Mensaje
[...] Por decir un ejemplo, yo tengo el codigo ... y creo un tenista con id=0 , osea vacio. Y le seteo los valores y le llamo a la funcion insert. Eso esta mal? [...]
no es tanto preguntarse si esta mal...

pues claramente hacer un SELECT con un ID que no existe, osea... cero ¿esta bien??


desde esa perspectiva yo veo que tu constructor no sirve, ya que por defecto siempre va hacer una consulta innecesaria si tratas de hacer un INSERT

al menos yo tomaría esa determinación
Código PHP:
function __constructor($id NULL)
{
  if (
$id 0// ... SELECT
  
else // ... INSERT

__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #5 (permalink)  
Antiguo 04/11/2009, 14:44
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Definir un constructor correcto para una clase

Pero si hago esto?

Código PHP:
public function __construct($id=0){
            if(
$id != 0){
                
$query sprintf("SELECT * FROM tenistas WHERE id='%d'",mysql_real_escape_string($id));
                
$result mysql_query($query,$conexion) or die(mysql_error());
                if(
mysql_num_rows($result) == 1){
                    
$fila mysql_fetch_object($result);
                    
$this->_id $fila->id;
                    
$this->_nombre $fila->nombre;
                }
            }
            else{
                
$this->_id = -1;
                
$this->_nombre "";
            }
        }

//Suponiendo q tengo los includes de la clase y demas...

$tenista = new Tenista();
$tenista->setNombre("Mario Araque (ARG)");
$tenista->insert(); 
Pasa q pienso que si yo pongo la insercion en el constructor, como comprobar que fue hecha con exito? Porque retornar error no puede un constructor, o si?

Saludos.
  #6 (permalink)  
Antiguo 04/11/2009, 15:22
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: Definir un constructor correcto para una clase

bueno, yo no dije que fuera necesario meter el INSERT en el constructor...

yo me refería a que desde ahí puedes pre-determinar que acción va a ejecutar algún método que uses...

de hecho, con tu ejemplo ya quedo claro...

- si no hay ID entonces, creamos un objeto vacío... ya luego insertamos
- al haber un ID pues pre-seleccionamos los datos, después actualizamos...

eso era todo, suerte!!
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #7 (permalink)  
Antiguo 04/11/2009, 15:25
Avatar de MarioAraque
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Valencia
Mensajes: 1.398
Antigüedad: 14 años, 6 meses
Puntos: 265
Respuesta: Definir un constructor correcto para una clase

Buenisimo, entonces me quedo super claro y ahora hice un constructor mas a la medida que buscaba!!!

Gracias y un saludo!
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 23:35.