domingo, 14 de diciembre de 2014

La Clase - Programación Orientada a Objetos en PHP - 2 de 3



7. Paso como argumento de tipo objeto

Los métodos son como las funciones, pueden tomar argumentos de tipos diferentes (Integer, String…) e incluso de tipo Objeto.

$gato y $perro son objetos de tipo Animal. Pueden pasar como argumento un método, siempre y cuando acepte este tipo de objeto.

Para probar este ejemplo, cambie el método comer() de la clase Animal. Se convierte en comer_animal(Animal $animal_comido) y toma como argumento un objeto de tipo Animal.

La página Animal.class.php se convierte en:

<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
//accesos
public function getColor()
{
return $this->color; //devuelve el color
}
public function setColor($color)
{
$this->color = $color; //escrito en el atributo color
}
public function getPeso()
{
return $this->peso; //devuelve el peso
}
public function setPeso($peso)
{
$this->peso = $peso; //escrito en el atributo peso
}
//Métodos
public function comer_animal(Animal $animal_comido)
{
//el animal que come aumenta su peso tanto
//como el del animal comido
$this->peso = $this->peso + $animal_comido->peso;
//el peso del animal comido y su color se restablecen a 0
$animal_comido->peso = 0;
$animal_comido->color = "";
}
public function moverse()
{
//método que pueda acceder a las propiedades
//color y peso
}
public function añadir_un_kilo()
{
$this->peso = $this->peso + 1;
}
}
?>

Para probar este método, la página uso.php se convierte en:

<?php
//carga de la clase
include(’Animal.class.php’);
//instanciar la clase Animal
$gato = new Animal();
//actualizar el peso del gato
$gato->setPeso(8);
//leer el peso
echo "El peso del gato es:".$gato->getPeso()." kg<br />";
//actualizar el color del gato
$gato->setColor("negro");
//leer el color
echo "El color del gato es:".$gato->getColor()."<br />";
//instanciar la clase Animal
$pez = new Animal();
//actualizar el peso del pez
$pez->setPeso(1);
//leer el peso
echo "El peso del pez es:".$pez->getPeso()." kg<br />";
//actualizar el color del pez
$pez->setColor("blanco");
//leer el color
echo "El color del pez es:".$pez->getColor()."<br /><br />";
//el gato come al pez
$gato->comer_animal($pez);
//leer el peso
echo "El nuevo peso del gato es:".$gato->getPeso()." kg<br />";
//leer el peso
echo "El peso del pez es:".$pez->getPeso()." kg<br />";
//leer el color
echo "El color del pez es:".$pez->getColor()."<br /><br />";
?>

Da como resultado:

El peso del gato es:8 kg
El color del gato es:negro
El peso del pez es:1 kg
El color del pez es:blanco
El nuevo peso del gato es:9 kg
El peso del pez es:0 kg
El color del pez es:

El objeto $gato llama al método comer_animal ($pez) y pasa como argumento el objeto de tipo Animal $pez. Es decir, el objeto $pez con sus atributos y sus métodos se pasan como argumento. Esto permite pasar como argumento varios valores con un único parámetro. El método comer_animal(Animal $animal_comido) solo acepta un argumento de tipo Animal.

Por lo tanto, no puede llamar al método de la siguiente manera:

$gato->comer_animal("Rana");

O de esta manera:

$gato->comer_animal(4);

Ya que los tipos "Rana" (String) y 4 (Integer) no son de tipo Animal.


8. El constructor

El constructor, como su nombre indica, sirve para construir un objeto del tipo clase. Cuando escribe new Animal(), por defecto llama al constructor de la clase Animal.

Puede crear sus propios constructores y así pasar como argumento el valor de los atributos que desea asignar a su objeto.

El constructor se designa __construct y no tiene return.

Para añadir un constructor que toma como argumentos el peso y el color, la página Animal.class.php se convierte en:

<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
public function __construct ($color, $peso)
//Constructor que solicita 2 argumentos.
{
echo ’Llamar al constructor.<br />’;
$this->color = $color; // Inicialización del
// color.
$this->peso = $peso; // Inicialización del peso.
}
Etc.
.
.
.
}
?>

Llamar al constructor en la página uso.php:

<?php
//carga de la clase
include(’Animal.class.php’);
//instanciar la clase Animal con su constructor
$perro = new Animal("beige",7);
//leer el peso
echo "El peso del perro es:".$perro->getPeso()." kg<br />";
//leer el color
echo "El color del perro es:".$perro->getColor()."<br />";
//actualizar el color del perro
$perro->setColor("negro");
//leer el color
echo "El color del perro es:".$perro->getColor()."<br />";
?>

Da como resultado:

Llamar al constructor.
El peso del perro es:7 kg
El color del perro es:beige
El color del perro es:negro

Se muestra en primer lugar "Llamar al constructor", ya que la instrucción echo que se ha escrito en el constructor __construct de su clase Animal se llama cada vez que ejecuta new Animal().

El constructor toma como argumento los valores de sus atributos. Esto evita llamar los métodos setColor() y setPeso().

En PHP no se puede declarar dos constructores en la misma clase.


9. El destructor

El destructor sirve para destruir el objeto con el fin de liberarlo de la memoria. Se llama automáticamente al final del script PHP o cuando se destruye el objeto.

Para destruir un objeto, puede utilizar la función unset(). Esta función toma como argumento el objeto que hay que destruir.

Por ejemplo, para destruir el objeto $perro:

<?php
//destrucción del objeto
unset($perro);
?>

Por defecto llama al destructor. Puede modificarlo si añade la función __destruct() en la clase.

<?php
class Animal
{
// Declaración de atributos
private $color = "gris";
private $peso = 10;
public function __construct ($color, $peso)
//Constructor que solicita 2 argumentos.
{
echo ’Llamar al constructor.<br />’;
$this->color = $color; // Inicialización del
// color.
$this->peso = $peso; // Inicialización del peso.
}
public function __destruct()
{
echo ’Llamar al destructor’;
}
Etc.
.
.
.
}
?>

Generalmente no es necesario aplicar el destructor en la clase.


10. Ejercicio

Enunciado (fácil)

Cree dos peces en la página uso.php:
  • pez1, gris, 10 kg
  • pez2, rojo, 7 kg

Muestre su peso y a continuación el pez1 se come al pez2.
Vuelva a mostrar su peso.

Solución

<?php
//carga de la clase
include(’Animal.class.php’);
//instanciar la clase Animal con su constructor
$pez1 = new Animal("gris",10);
$pez2 = new Animal("rojo",7);
//leer el peso
echo "El peso del pez1 es:".$pez1->getPeso()." kg<br />";
//leer el peso
echo "El peso del pez2 es:".$pez2->getPeso()." kg<br />";
//el pez1 se come al pez2
$pez1->comer_animal($pez2);
//leer el peso
echo "El nuevo peso del pez1 es:".$pez1->getPeso()." kg<br />";
//leer el nuevo peso
echo "El nuevo peso del pez2 es:".$pez2->getPeso()." kg<br />";
?>

Da como resultado:

Llamada al constructor.
Llamada al constructor.
El peso del pez1 es:10 kg
El peso del pez2 es:7 kg
El nuevo peso del pez1 es:17 kg
El nuevo peso del pez2 es:0 kg
Llamada al destructor
Llamada al destructor



Espero haber ayudado en algo. Hasta la próxima oportunidad!









No hay comentarios:

Publicar un comentario en la entrada