Programación orientada a objetos en PHP 1: Introducción

En Urlan Heat nos gusta que la gente que quiere hacer mal las cosas las haga realmente mal, pero también nos gusta ayudar a los que lo quieren hacer bien. Por eso empezamos esta serie de programación orientada a objetos en PHP.

Esta serie está dedicada a todos aquellos que quieren aprender a usar objetos en PHP. Espero poder introduciros en el apasionante mundo de la programación orientada a objetos con todas las ventajas que nos ofrece.

¿Por qué deberíamos usar programación orientada a objetos? Hay varias razones:

  • El código es más limpio.
  • Es más fácil de ampliar y mantener.
  • Permite hacer tests, pruebas unitarias, pruebas de validación, etc.
  • El código es reutilizable. Me he encontrado con mucha gente que piensa que reutilizar código es simplemente usar el copy/paste, pero es algo que va mucho más allá y es más eficiente. Hablaré de ello en algún otro artículo.

Vamos a empezar con un sencillo ejemplo de una aplicación de noticias. Dado que va a ser una aplicación sencilla no a a tener acceso a una base de datos.

Lo primero será crear un fichero al que vamos a llamar, por ejemplo, Noticia.php.

Para definir una clase basta usar la palabra reservada class delante del nombre de la clase. Los nombres de las clases se suelen poner con la primera letra en mayúscula usando la notación camel case.

class Noticia {

}

Podemos pensar en una clase como una especie de plantilla que no hace nada por si misma. Para usar una clase debemos crear una variable especial a la que llamamos objeto:

El objeto se define usando el operador new seguido del nombre de la clase y el paréntesis:

class Noticia {
}
$noticia = new Noticia();

El crear un objeto a partir de una clase se llama instanciar una clase.

Propiedades de un objeto

Dentro de una clase podemos tener variables. Cuando una variable está definida dentro de una clase se la llama propiedad. En nuestro caso podemos crear la propiedad título que contendrá el título de la noticia:

class Noticia {
	public $titulo;
}

La propiedad se define igual que una variable normal pero anteponiendo la palabra reservada public. Este public que he puesto indica que se puede acceder a la propiedad título desde fuera de la clase.

Además de public una propiedad se puede definir como private o como protected:

private $titulo;
protected $titulo;

Por ahora no vamos a preocuparnos de ésto, lo trataremos a fondo en otro artículo.

Por lo demás las propiedades funcionan igual que una variable normal. A una propiedad podemos darle un valor inicial:

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

$noticia = new Noticia();

Para poder ver el resultado de este sencillo script vamos a añadir la función var_dump() que nos mostrará objeto $noticia:

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

$noticia = new Noticia();
var_dump($noticia);

Abrimos un terminal y ejecutamos nuestro programilla usando el comando:

php Noticia.php

El resultado es un objeto de la clase Noticia que tiene una propiedad llamada $titulo que es un string de quince caracteres y con el valor ‘Primera noticia’:

object(Noticia)#1 (1) {
["titulo"]=>
string(15) "Primera noticia"
}

Ahora vamos a modificar el valor de la propiedad título usando el objeto que hemos creado. Para acceder a las propiedades de un objeto usamos el operador – >. Como la propiedad titulo es pública podemos modificarla directamente:

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

$noticia = new Noticia();
$noticia->titulo = 'Título modificado';

var_dump($noticia);

Y ahora a la consola de nuevo para ver el resultado. Vemos que la propiedad objeto ha cambiado de valor:

object(Noticia)#1 (1) {
["titulo"]=>
string(18) "Título modificado"
}

Métodos

A un objeto también podemos añadirle funciones. Al igual que sucede con las variables, cuando una función que está dentro de una clase se le cambia el nombre y se la llama método. Para ilustrar cómo funcionan vamos a añadir un método que muestre el contenido de la propiedad título:

public function mostrar()
{
	echo $this->titulo;
}

Para poder acceder a la propiedad título desde dentro de una clase debemos usar la variable $this. Esta es una variable especial que permite referirnos a los distintos métodos y propiedades de una clase.

Ahora cambiamos el var_dump por el nuevo método que hemos creado:

class Noticia {

	public $titulo = 'Primera noticia';
	public function mostrar()
	{
		echo $this->titulo;
	}
}

$noticia = new Noticia();
$noticia->titulo = 'Título modificado';
$noticia->mostrar();

Al ejecutar el programa tenemos el resultado esperado: «Título modificado».

Podemos añadir un salto de línea para que quede más elegante:

echo $this->titulo . “\n”;

O también podemos hacer:

echo “{$this->titulo}\n”;

Parámetros en métodos

A un método se le pueden pasar parámetros como a una función normal. Podemos, por ejemplo, crear una función que cambie el título de la noticia. El parámetro que le vamos a pasar al método será el título de la noticia:

public function cambiarTitulo( $titulo )

Como verás para el nombre de la función también uso la notación Camel Case pero la primera letra en este caso es minúscula.

Dentro de la función asignamos el valor del parámetro $titulo a la propiedad titulo.

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

Ojo, la variable $titulo es una variable local que sólo tiene validez dentro de este método. Aunque el parámetro y la propiedad título tengan el mismo nombre, son cosas diferentes. Recuerda que, para acceder a la propiedad, hay que usar $this.

Para usar este nuevo método basta con hacer:

$noticia->cambiarTitulo('Nuevo título');

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

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

	public function mostrar()
	{
		echo $this->titulo;
	}

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

$noticia = new Noticia();
$noticia->cambiarTitulo('Título modificado');
$noticia->mostrar();

Si ejecutamos el código vemos que el resultado es el mismo que antes.

Crear múltiples objetos con una misma clase

Con una misma clase podemos crear todos los objetos que queramos. A pesar de usar la misma clase cada objeto tendrá sus propias propiedades. Cambiar una propiedad en un objeto no afecta para nada a los demás.

Veamoslo creando un segundo objeto:

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

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

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

$noticia = new Noticia();
$noticia->cambiarTitulo('Nuevo titulo');
$noticia->mostrar();

$otraNoticia = new Noticia();
$otraNoticia->cambiarTitulo('Segunda noticia');
$otraNoticia->mostrar();

$noticia->mostrar();

Ejecutando el programa vemos que modificar $otraNoticia no altera a $noticia.

Antes de pasar a la siguiente artículo puedes practicar creando más propiedades y métodos. Por ejemplo puedes crear las propiedades cuerpoNoticia o autor y los correspondientes métodos para modificarlas y mostrarlas.

Lo mismo, pero en vídeo

Si prefieres el vídeo aquí tienes el enlace:

 

3 thoughts on “Programación orientada a objetos en PHP 1: Introducción”

Leave a Comment