Programación orientada a objetos en PHP 2: Constructores y destructores

En este segundo artículo vamos a hablar de constructores y destructores.

Cada vez que creamos un objeto hay una función que se ejecuta de forma automática. Es una función a la que se llama constructor.

Esta es una función “magica”, que se ejecuta sin que tengamos que llamarla. Podemos verla en acción con un sencillo ejemplo. Tomemos el código del artículo anterior y le añadimos el constructor.

Un constructor se define así:

function __construct()
{
}

Vamos a hacer un constructor que lo único que va a hacer será mostrar un mensaje en la pantalla cuando se cree el objeto:

class Noticia
{
	public $titulo = 'Primera noticia';

	function __construct()
	{
		echo "Objeto creado\n";
	}

	public function mostrar()
	{
		echo $this->titulo . "\n";
	}

	public function cambiarTitulo($titulo)
	{
		$this->titulo = $titulo;
	}
}

$noticia = new Noticia();
$noticia->cambiarTitulo("Mi noticia");
$noticia->mostrar();

Si nos vamos a la consola podemos ver el resultado ejecutando el código usando php Noticia.php:

Objeto creado
Mi noticia

Para ver más claro cuándo se llama a esta función vamos a añadir una línea extra justo delante de la creación del objeto:

echo "Comienzo:\n";
$noticia = new Noticia();
$noticia->cambiarTitulo("Mi noticia");
$noticia->mostrar();

Y si volvemos a la consola y ejecutamos el código:

Comienzo:
Objeto creado
Primera noticia

Podemos ver que el mensaje “Objeto creado” se muestra entre el echo y la llamada al método mostrar(). Es decir, se llama a la función __construct() justo en el momento de crear el objeto.

Vale, todo esto es muy bonito pero ¿Para qué sirve un constructor? Para resumir diremos que un constructor se encarga de dejar el objeto listo para ser usado.

Vamos a verlo más claro con un ejemplo. Supongamos que no queremos dar un valor inicial a una noticia como hemos hecho hasta ahora. ¿Qué sentido tiene dar el valor “Primera noticia” a todas las noticias que creemos? Lo que sí tiene más sentido es que en el momento de crear el objeto se le asigne un valor.

Para conseguirlo definiríamos el constructor así:

function __construct($titulo)
{
	$this->titulo = $titulo;
}

Y en la creación del objeto tendríamos que pasarle el valor inicial:

$noticia = new Noticia("Estamos aprendiendo POO");

Con lo que el código quedaría así:

class Noticia
{
	public $titulo;

	function __construct($titulo)
	{
		$this->titulo = $titulo;
	}

	public function mostrar()
	{
		echo $this->titulo . "\n";
	}

	public function cambiarTitulo($titulo)
	{
		$this->titulo = $titulo;
	}
}

$noticia = new Noticia("Estamos aprendiendo POO");
$noticia->mostrar();

Si vamos a la consola vemos que está todo correcto:

gorka$ php Noticia.php
Estamos aprendiendo POO

¿Qué pasaría si no le damos el parámetro al constructor? Pues que tendremos un bonito recordatorio de que hemos metido la pata:

PHP Warning: Missing argument 1 for Noticia::__construct(), called in /home/gorka/PhpstormProjects/test/Noticia.php on line 24 and defined in /home/gorka/PhpstormProjects/test/Noticia.php on line 6
PHP Notice: Undefined variable: titulo in /home/gorka/PhpstormProjects/test/Noticia.php on line 8PHP Warning: Missing argument 1 for Noticia::__construct(), called in /home/gorka/PhpstormProjects/test/Noticia.php on line 24 and defined in /home/gorka/PhpstormProjects/test/Noticia.php on line 6
PHP Notice: Undefined variable: titulo in /home/gorka/PhpstormProjects/test/Noticia.php on line 8

Por supuesto podemos pasar un parámetro vacío y esto no provocará ningún error:

$noticia = new Noticia("");

El formato antiguo

Si has visto código con objetos anteriormente es posible que te hayas encontrado con unos constructores diferentes, algo así:

public function Noticia()

Esta es la forma antigua de los constructores. En PHP 7 se consideran obsoletos y en futuras versiones desaparecerán así que es mejor usar el sistema nuevo.
Por último es importante tener en cuenta que un constructor no devuelve ningún valor.

Destructores

Hay otra función especial que se ejecuta cuando el objeto se elimina de la memoria o cuando termina la ejecución del programa. El nombre de esta función es el destructor.
Se define igual que el constructor.

function __destruct()
{
echo "Objeto destruido\n";
}

Si añadimos esta función a nuestro programa:

class Noticia
{
	public $titulo;

	function __construct($titulo)
	{
		$this->titulo = $titulo;
	}

	function __destruct()
	{
	echo "Objeto destruido\n";
	}

	public function mostrar()
	{
		echo $this->titulo . "\n";
	}

	public function cambiarTitulo($titulo)
	{
		$this->titulo = $titulo;
	}
}

$noticia = new Noticia("Noticia");
$noticia->mostrar();

y lo ejecutamos:

Noticia
Objeto destruido

vemos que se llama a esta función al final del programa.

Los destructores no devuelven ningún valor ni se les pueden pasar parámetros.

Por ahora es suficiente de constructores y destructores. Volveremos a hablar de los constructores más adelante cuando hablemos de herencia.

Os dejo aquí el vídeo donde cuento esto mismo pero en plan charlatán:

1 thought on “Programación orientada a objetos en PHP 2: Constructores y destructores”

Leave a Comment