Modelo de objetos en PHP5

Control de tipos en PHP

PHP incorpora una característica muy interesante por sí misma y que además mejora la funcionalidad que ofrece la herencia (clases e interfaces). Se trata del control de tipos en parámetros pasados a funciones y métodos. Este control sólo es válido para objetos, no para tipos elementales.

El siguiente ejemplo define una función muestraNombre() que sólo acepta un argumento de tipo Persona (sólo instancias de la clase Persona):

//// clase Persona
class Persona
{
public
$nombre;
}

//// clase Gato
class Gato
{
public
$nombre;
}


//// esta funcion solo puede recibir objetos
//// de tipo Persona
function muestraNombre(Persona $persona)
{
echo
$persona->nombre;
}


$persona = new Persona;
$persona->nombre = "Pepe";

$gato = new Gato;
$gato->nombre = "Rufus";


//// correcto
muestraNombre ($persona);

//// ERROR: un gato no es una persona
muestraNombre ($gato);

Parece lógico que si una función acepta objetos de una determinada clase, los acepte también de sus clases derivadas. Un objeto de una clase derivada es en esencia del mismo tipo que el de la clase base (aunque más específico):

//// una Mujer es una Persona
class Mujer extends Persona
{
public
$genero = "Femenino";
}



$persona = new Persona;
$persona->nombre = "Pepe";

$mujer = new Mujer;
$mujer->nombre = "Ana";

//// correcto
muestraNombre ($persona);

//// correcto
muestraNombre ($mujer);


//// ERROR: un gato no es una persona
//// muestraNombre ($gato);

El funcionamiento con interfaces es idéntico. Se pueden diseñar funciones que sólo acepten objetos que implementan una determinada interfaz.

interface Ficha
{
public function
queEres();
}

//// clase Persona
class Persona implements Ficha
{
public function
queEres()
{
return
"Soy una persona";
}
}

//// clase Gato
class Gato implements Ficha
{
public function
queEres()
{
return
"Soy un gato";
}
}

//// clase Barco
class Barco
{
public function
queEres()
{
return
"Soy un barco";
}
}

//// pregunta 'que eres' a los objetos
//// que tengan Ficha
function curiosidad (Ficha $objeto)
{
return
$objeto->queEres();
}


$persona = new Persona;
$gato = new Gato;
$barco = new Barco;

//// correcto
echo curiosidad ($persona);
echo
"<br>";

//// correcto
echo curiosidad ($gato);
echo
"<br>";

//// ERROR: la clase barco no implementa Ficha
echo curiosidad ($barco);
echo
"<br>";