En PHP las interfaces permiten definir el comportamiento que una clase debe tener pero sin proveer la implementación de tal comportamiento. Esto también es llamado un contract: al implementar una interface la clase acepta los términos del contrato.
En Zend Framework 3 las interfaces son ampliamente usadas. Por ejemplo, la clase Application
implementa
la ApplicationInterface
, de esta manera se definen los métodos que cada clase application debe proveer:
<?php
namespace Zend\Mvc;
interface ApplicationInterface
{
// Retrieves the service manager.
public function getServiceManager();
// Retrieves the HTTP request object.
public function getRequest();
// Retrieves the HTTP response object.
public function getResponse();
// Runs the application.
public function run();
}
Como podemos ver en el ejemplo de arriba una interfaz es definida usando la palabra
reservada interface
casi de la misma manera como definimos una clase PHP estándar.
Así como una clase usual las interfaces definen métodos. Sin embargo, la interfaz no provee
ninguna implementación de sus métodos. En la interface ApplicationInterface
definida arriba
podemos ver que cada aplicación que implemente esta interfaz tendrá el método getServiceManager()
para recuperar el Gestor de Servicios (el Gestor de Servicios lo revisaremos más adelante
en este capítulo), los métodos getRequest()
y getResponse()
que respectivamente recuperan
las peticiones y respuestas HTTP, y el método run()
para ejecutar la aplicación.
En Zend Framework 3, por convención, las interfaces de clases deben incluir en su nombre el sufijo
Interface
por ejemploApplicationInterface
.
La clase que implementa una interfaz se llama clase concreta. La clase concreta Application
implementa la ApplicationInterface
, lo que significa que provee la implementación de los métodos
definidos por la interface:
<?php
namespace Zend\Mvc;
class Application implements ApplicationInterface
{
// Implement the interface's methods here
public function getServiceManager()
{
// Provide some implementation...
}
public function getRequest()
{
// Provide some implementation...
}
public function getResponse()
{
// Provide some implementation...
}
public function run()
{
// Provide some implementation...
}
}
La clase concreta Application
usa la palabra clave implements
para mostrar que
esta provee una implementación de todos los métodos de la interfaz ApplicationInterface
.
Además, la clase Application
puede tener métodos adicionales que no están en
la interfaz.
Gráficamente las relaciones entre las clases se muestran usando un diagrama de herencia.
En la figura 3.1, se muestra el diagrama de la clase Application
. La flecha
apunta desde la clase hijo a la clase padre.