Los atributos de los objetos pueden ser otros objetos

  • Por
  • 04 de julio de 2005
  • Valoración:
  • 1 Comentarios
  • Manuales de PHP
Los atributos o propiedades de los objetos pueden ser de cualquier tipo, incluso pueden ser otros objetos.
Las características de los objetos, que se almacenan por medio de los llamados atributos o propiedades, pueden ser de diversa naturaleza. La clase hombre puede tener distintos tipos de atributos, como la edad (numérico), el nombre propio (tipo cadena de caracteres), color de piel (que puede ser un tipo cadena de caracteres o tipo enumerado, que es una especie de variable que sólo puede tomar unos pocos valores posibles). También puede tener una estatura o un peso (que podrían ser de tipo float o número en coma flotante).

En general, podemos utilizar cualquier tipo para los atributos de los objetos, incluso podemos utilizar otros objetos. Por ejemplo, podríamos definir como atributo de la clase hombre sus manos. Dada la complejidad de las manos, estas podrían definirse como otro objeto. Por ejemplo, las manos tendrían como características la longitud de los dedos, un coeficiente de elasticidad. Como funcionalidades o métodos, podríamos definir agarrar algo, soltarlo, pegar una bofetada, o cortarse las uñas. Así pues, uno de los atributos de la clase hombre podría ser un nuevo objeto, con su propias características y funcionalidades. La complejidad de las manos no le importa al desarrollador de la clase hombre, por el principio de encapsulación, dado que este conoce sus propiedades (o aquellas declaradas como public) y los métodos (también los que se hayan decidido declarar como públicos) y no necesita preocuparse sobre cómo se han codificado.

Clase cliente del videoclub

Para continuar el ejemplo del videoclub, hemos creado la clase cliente que vamos a explicar a continuación. En los clientes hemos definido como atributo, entre otros, las películas o juegos alquilados.

Nota:Como vemos, los objetos pueden tener algunos atributos también de tipo objeto. En ese caso pueden haber distintos tipos de relaciones entre objetos. Por ejemplo, por pertenencia, como en el caso de la clase hombre y sus manos, pues a un hombre le pertenecen sus manos. También se pueden relacionar los objetos por asociación, como es el caso de los clientes y las películas que alquilan, pues en ese caso un cliente no tiene una película propiamente dicha, sino que se asocia con una película momentáneamente.

La clase cliente que hemos creado tiene cierta complejidad, esperamos que no sea demasiada para que se pueda entender fácilmente. La explicaremos poco a poco para facilitar las cosas.

Atributos de la clase cliente

Hemos definido una serie de atributos para trabajar con los clientes. Tenemos los siguientes:

public $nombre;
private $numero;
private $soportes_alquilados;
private $num_soportes_alquilados;
private $max_alquiler_concurrente;


Como se puede ver, se han definido casi todos los atributos como private, con lo que sólo se podrán acceder dentro del código de la clase.

El atributo nombre, que guarda el nombre propio del cliente, es el único que hemos dejado como público y que por tanto se podrá referenciar desde cualquier parte del programa, incluso desde otras clases. El atributo numero se utiliza para guardar el identificador numérico del cliente. Por su parte, soportes alquilados nos servirá para asociar al cliente las películas o juegos cuando este las alquile. El atributo num_soportes_alquilados almacenará el número de películas o juegos que un cliente tiene alquilados en todo momento. Por último, max_alquiler_concurrente indica el número máximo de soportes que puede tener alquilados un cliente en un mismo instante, no permitiéndose alquilar a ese cliente, a la vez, más que ese número de películas o juegos.

El único atributo sobre el que merece la pena llamar la atención es soportes_alquilados, que contendrá un array de soportes. En cada casilla del array se introducirán las películas o juegos que un cliente vaya alquilando, para asociar esos soportes al cliente que las alquiló. El array contendrá tantas casillas como el max_alquiler_concurrente, puesto que no tiene sentido asignar mayor espacio al array del que se va a utilizar. Para facilitar las cosas, cuando un cliente no tiene alquilado nada, tendrá el valor null en las casillas del array.

Nota:Recordemos que los soportes fueron definidos en capítulos anteriores de este manual de PHP 5 , mediante un mecanismo de herencia. Soporte era una clase de la que heredaban las películas en DVD, las cintas de vídeo y los juegos.

Constructor de la clase cliente

function __construct($nombre,$numero,$max_alquiler_concurrente=3){
   $this->nombre=$nombre;
   $this->numero=$numero;
   $this->soportes_alquilados=array();
   $this->num_soportes_alquilados=0;
   $this->max_alquiler_concurrente = $max_alquiler_concurrente;
   //inicializo las casillas del array de alquiler a "null"
   //un valor "null" quiere decir que el no hay alquiler en esa casilla
   for ($i=0;$i<$max_alquiler_concurrente;$i++){
      $this->soportes_alquilados[$i]=null;
   }
}


El constructor de la clase cliente recibe los datos para inicializar el objeto. Estos son $nombre, $numero y $max_alquiler_concurrente. Si nos fijamos, se ha definido por defecto a 3 el número máximo de alquileres que puede tener un cliente, de modo que, en el caso de que la llamada al constructor no envíe el parámetro $max_alquiler_concurrente se asumirá el valor 3.

El atributo soportes_alquilados, como habíamos adelantado, será un array que tendrá tantas casillas como el máximo de alquileres concurrentes. En las últimas líneas se inicializan a null el contenido de las casillas del array.

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.

Comentarios

Joseba

28/3/2012
Duda sobre el articulo
Dice al final del articulo que "el constructor de la clase cliente recibe los datos para inicializar el objeto" y solo recibe tres de los cinco atributos de la clase. Imagino que el motivo de que no se pasen dos de los atributos es que son cambiantes al contrario de lo que ocurre con número, nombre y número máximo de alquileres, ¿Es así?

Gracias, un saludo!!!

Compartir