Los atributos de los objetos pueden ser otros objetos, 2º parte

  • Por
Continuación del artículo sobre las propiedades de los objetos.

Método dame_numero()

function dame_numero(){ 
   return $this->numero; 
}

Este método simplemente devuelve el numero de identificación del cliente. Como se ha definido el atributo numero como private, desde fuera del código de la clase, sólo se podrá acceder a este a través del método dame_numero().

Método tiene_alquilado($soporte)

function tiene_alquilado($soporte){ 
  for ($i=0;$i<$this->max_alquiler_concurrente;$i++){ 
   if (!is_null($this->soportes_alquilados[$i])){ 
    if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $soporte->dame_numero_identificacion()){ 
     return true; 
    } 
   } 
  } 
  //si estoy aqui es que no tiene alquilado ese soporte 
 return false; 
}

Este recibe un soporte y devuelve true si está entre los alquileres del cliente. Devuelve false en caso contrario.

A este método lo llamamos desde dentro de la clase cliente, en la codificación de otro método. Podríamos haber definido entonces el método como private, si pensásemos que sólo lo vamos a utilizar desde dentro de esta clase. En este caso lo hemos definido como public (el modificador por defecto) porque pensamos que puede ser útil para otras partes del programa.

Este método recibe un soporte (cualquier tipo de soporte, tanto cintas de vídeo, como DVDs o juegos). Realiza un recorrido por el array de soportes alquilados preguntando a cada soporte que tenga alquilado el cliente si su número de identificación es igual que el del soporte recibido por parámetro. Como el número de identificación del soporte está definido como private en la clase soporte, para acceder a su valor tenemos que utilizar el método de soporte dame_numero_identificación().

Otra cosa importante. Como no es seguro que en el array de soportes alquilados haya algún soporte (recordamos que si el cliente no tiene nada alquilado las casillas están a null), antes de llamar a ningún método del soporte debemos comprobar que realmente existe. Esto se hace con la función is_null() a la que le enviamos la casilla del array donde queremos comprobar si existe un soporte. Si la función is_null() devuelve true es que tiene almacenado el valor null, con lo que sabremos que no hay soporte. De manera contraria, si la casilla almacena un soporte, la función is_null() devolverá false.

Método alquila($soporte)

function alquila($soporte){ 
  if ($this->tiene_alquilado($soporte)){ 
   echo "<p>El cliente ya tiene alquilado el soporte <b>" . $soporte->titulo . "</b>"; 
  }elseif ($this->num_soportes_alquilados==$this->max_alquiler_concurrente){ 
   echo "<p>Este cliente tiene " . $this->num_soportes_alquilados . " elementos alquilados. "; 
   echo "No puede alquilar más en este videoclub hasta que no devuelva algo"; 
  }else{ 
   //miro en el array a ver donde tengo sitio para meter el soporte 
   $cont = 0; 
   while (!is_null($this->soportes_alquilados[$cont])){ 
    $cont++; 
   } 
   $this->soportes_alquilados[$cont]=$soporte; 
   $this->num_soportes_alquilados++; 
   echo "<p><b>Alquilado soporte a: </b>" . $this->nombre . "<br>"; 
   $soporte->imprime_caracteristicas(); 
  } 
}

Este método sirve para alquilar una película o juego por parte del cliente. Recibe el soporte a alquilar y, en caso que el alquiler se pueda producir, debe introducir el objeto soporte recibido en el array de soportes alquilados del cliente.

Lo primero que hace es comprobar que el cliente no tiene alquilado ese mismo soporte, utilizando el método tiene_alquilado() de la clase soporte. Si no lo tiene alquilado comprueba que todavía tiene capacidad para alquilar otro soporte, es decir, que no ha llegado al máximo en el número de soportes alquilados.

Si se puede alquilar el soporte, lo introduce dentro del array soportes_alquilados en una posición vacía (una casilla donde antes hubiera un null), incrementa en uno el número de soportes alquilados e imprime las características del soporte que se ha alquilado.

Método devuelve($identificador_soporte)

function devuelve($identificador_soporte){ 
  if ($this->num_soportes_alquilados==0){ 
   echo "<p>Este cliente no tiene alquilado ningún elemento"; 
   return false; 
  } 
  //recorro el array a ver si encuentro el soporte con identificador recibido 
  for ($i=0;$i<$this->max_alquiler_concurrente;$i++){ 
   if (!is_null($this->soportes_alquilados[$i])){ 
    if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $identificador_soporte){ 
    echo "<p>Soporte devuelto: " . $identificador_soporte; 
    echo " <b>" . $this->soportes_alquilados[$i]->titulo . "</b>"; 
     $this->soportes_alquilados[$i]=null; 
     $this->num_soportes_alquilados--; 
     return true; 
    } 
   } 
  } 
  //si estoy aqui es que el cliente no tiene ese soporte alquilado 
  echo "<p>No se ha podido encontrar el soporte en los alquileres de este cliente"; 
  return false; 
}

El método devuelve recibe el identificador del soporte que debe devolver el cliente. Devuelve true si se consiguió devolver el soporte, false en caso contrario. Lo primero que hace es comprobar si el cliente tiene alquilado algún soporte, comprobando que la variable num_soportes_alquilados no sea cero.

Luego hace un recorrido por el array de soportes alquilados para ver si encuentra el soporte que se desea devolver. Para cada soporte alquilado (cada casilla del array que no contenga el valor null) comprueba si el identificador es el mismo que el recibido por parámetro. Cuando encuentra el soporte, muestra un mensaje por pantalla y lo devuelve simplemente poniendo a null la casilla correspondiente del array soportes_alquilados y decrementando en uno el atributo num_soportes_alquilados.

Si se encuentra el soporte, se sale de la función devolviendo true. Por lo que, si no se ha salido de la función después de hacer el recorrido por el array, sabemos que no se ha encontrado ese soporte. Entonces mostramos un mensaje en pantalla y devolvemos false.

Método lista_alquileres()

function lista_alquileres(){ 
  if ($this->num_soportes_alquilados==0){ 
   echo "<p>Este cliente no tiene alquilado ningún elemento"; 
  }else{ 
   echo "<p><b>El cliente tiene " . $this->num_soportes_alquilados . " soportes alquilados</b>"; 
   //recorro el array para listar los elementos que tiene alquilados 
   for ($i=0;$i<$this->max_alquiler_concurrente;$i++){ 
    if (!is_null($this->soportes_alquilados[$i])){ 
     echo "<p>"; 
     $this->soportes_alquilados[$i]->imprime_caracteristicas(); 
    } 
   } 
  } 
}

Este método hace un recorrido por el array de soportes alquilados y muestra las características de cada soporte. Comprueba que el cliente tiene algo alquilado antes de hacer el recorrido.

Recordar siempre, antes de llamar a un método del soporte almacenado en cada casilla del array, comprobar que el contenido de esa casilla no es null.

Método imprime_caracteristicas()

function imprime_caracteristicas(){ 
  echo "<p><b>Cliente " . $this->numero . ":</b> " . $this->nombre; 
  echo "<br>Alquileres actuales: " . $this->num_soportes_alquilados 
}

Simplemente muestra algunos de los datos del cliente. Es un método para obtener algún dato por pantalla de un cliente.

Comprobar el funcionamiento de la clase cliente

Es importante señalar que, para que la clase cliente funcione, debe disponer de los códigos de las distintas clases de las que hace uso (la clase soporte, cinta_video, juego y dvd). Estos códigos se pueden haber escrito en el mismo archivo o bien incluirse con unas instrucciones como estas:

include "soporte.php"; 
include "dvd.php"; 
include "juego.php"; 
include "cinta_video.php";

La clase cliente se puede poner en funcionamiento, para probar su correcta implementación, con un código como este:

//instanciamos un par de objetos cliente 
$cliente1 = new cliente("Pepe", 1); 
$cliente2 = new cliente("Roberto", 564); 

//mostramos el numero de cada cliente creado 
echo "El identificador del cliente 1 es: " . $cliente1->dame_numero(); 
echo "<br>El identificador del cliente 2 es: " . $cliente2->dame_numero(); 

//instancio algunos soportes 
$soporte1 = new cinta_video("Los Otros", 1, 3.5, "115 minutos"); 
$soporte2 = new juego("Final Fantasy", 2, 2.5, "Playstation",1,1); 
$soporte3 = new dvd("Los Intocables", 3, 3, "Inglés y español","16:9"); 
$soporte4 = new dvd("El Imperio Contraataca", 4, 3, "Inglés y español","16:9"); 

//alquilo algunos soportes 
$cliente1->alquila($soporte1); 
$cliente1->alquila($soporte2); 
$cliente1->alquila($soporte3); 

//voy a intentar alquilar de nuevo un soporte que ya tiene alquilado 
$cliente1->alquila($soporte1); 

//el cliente tiene 3 soportes en alquiler como máximo 
//este soporte no lo va a poder alquilar 
$cliente1->alquila($soporte4); 

//este soporte no lo tiene alquilado 
$cliente1->devuelve(4); 
//devuelvo un soporte que sí que tiene alquilado 
$cliente1->devuelve(2); 
//alquilo otro soporte 
$cliente1->alquila($soporte4); 

//listo los elementos alquilados 
$cliente1->lista_alquileres();

La ejecución de este código, si todo funciona correctamente, debería devolvernos como resultado esta salida:

El identificador del cliente 1 es: 1
El identificador del cliente 2 es: 564

Alquilado soporte a: Pepe
Película en VHS:
Los Otros
3.5 (IVA no incluido)
Duración: 115 minutos

Alquilado soporte a: Pepe
Juego para: Playstation
Final Fantasy
2.5 (IVA no incluido)
Para un jugador

Alquilado soporte a: Pepe
Película en DVD:
Los Intocables
3 (IVA no incluido)
Inglés y español
El cliente ya tiene alquilado el soporte Los Otros

Este cliente tiene 3 elementos alquilados. No puede alquilar más en este videoclub hasta que no devuelva algo

No se ha podido encontrar el soporte en los alquileres de este cliente

Soporte devuelto: 2 Final Fantasy

Alquilado soporte a: Pepe
Película en DVD:
El Imperio Contraataca
3 (IVA no incluido)
Inglés y español

El cliente tiene 3 soportes alquilados

Película en VHS:
Los Otros
3.5 (IVA no incluido)
Duración: 115 minutos

Película en DVD:
El Imperio Contraataca
3 (IVA no incluido)
Inglés y español

Película en DVD:
Los Intocables
3 (IVA no incluido)
Inglés y español

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

juan

11/11/2009
redaccion
En la parte donde dices: "Lo primero que hace es comprobar que el cliente no tiene alquilado ese mismo soporte, utilizando el método tiene_alquilado() de la clase soporte"....En realidad el método tiene_alquilado() es de la clase cliente....

Celes

04/12/2011
Falta un ; en la linea echo "Alquileres actuales: " . $this->num_soportes_alquilados
function imprime_caracteristicas(){
echo "<p><b>Cliente " . $this->numero . ":</b> " . $this->nombre;
------------------------------------------------------------------------------
echo "<br>Alquileres actuales: " . $this->num_soportes_alquilados;
------------------------------------------------------------------------------
}

eorm

24/4/2012
preguntar
la funcion devuelve cual de donde sale el parametro que le envian a la funcion?? asi como esta no funciona?? gracias

julion

30/11/2012
$this->soportes_alquilados[$i]->dame_numero_identificacion()???
NO SE QUE SIGNIFICA ESTE CÓDIGO $this->soportes_alquilados[$i]->dame_numero_identificacion(), Y ME MARCA ERROR EN EL IF, EL AUTOR NO LO EXPLICA ME SIENTO FRUSTRADO DE NO PODER RESOLVERLO

David

24/3/2014
Posible error en los métodos "tiene_alquilado($soporte)" y "devuelve($identificador_soporte)"
Creo que en hay un error en el siguiente condicional y da error al ejecutar:
if ($this->soportes_alquilados[$i]->dame_numero_identificacion() == $soporte->dame_numero_identificacion())

El problema puede estar en el método "dame_numero_identificacion()" que pertenece al la clase Soporte y no a la clase cliente, por lo que debería quitarse de la primera sentencia del condicional, quedando lo siguiente:

if($this->soportes_alquilados[$i] == $soporte->dame_numero_identificacion()){
...........
}
Saludos.

pepogilmalaga

28/3/2014
ERROR
Hola,
Yo ya había probado la idea que comentabas David, pero sigue sin funcionar. He dado varias vueltas y el problema es que el Array que se supone deberia contener los alquileres realizados todas las casillas estan en null, por eso da un error. Por que aunque llamemos a un metodo de la clase soporte, si todo fuera bien, lo que tendriamos en esa posicion seria un objeto de alguno de los soportes, el error da por que el array no se completa.

Luis Carlos Daza

17/6/2014
Muy buena explicación
Solamente quería agradecer la buena explicación.

hax_sx

30/9/2014
:( demaciado bueno para ser verdad
estaba siguiendo el tuto desde el inicio paso a paso !.
pero hay incoherencias en las explicaciones, y de pronto ya es este paso te desesperas no explicas y hay errores !: desde el paso anterior hay errores y que al seguir el tito se ve que no concuerda ya lo que dices con lo que tenemos o los resultados que aparecen !.

se agradece el esfuerzo enserio !.l
pero se ve que prisa tenias por terminar el tutorial y ya muchos nos dejaste con muchas dudas !.