Interface PHP

Resumo : neste tutorial você aprenderá sobre a interface PHP e como usar uma interface para definir um contrato entre classes.

Introdução à interface PHP

Uma interface permite especificar um contrato que uma classe deve implementar. Para definir uma interface, você usa a interfacepalavra-chave da seguinte forma:

<?php

interface MyInterface
{
	//...
}
Linguagem de código:  HTML, XML  ( xml )

Uma interface consiste em métodos que não contêm implementação. Em outras palavras, todos os métodos da interface são métodos abstratos. Uma interface também pode incluir constantes. Por exemplo:

<?php

interface MyInterface
{
	const CONSTANT_NAME = 1;

	public function methodName();
}Linguagem de código:  HTML, XML  ( xml )

Observe que todos os métodos da interface devem ser públicos.

Quando você define uma classe (classe filha) que reutiliza propriedades e métodos de outra classe (classe pai), a classe filha estende a classe pai .

Entretanto, para interfaces, dizemos que uma classe implementa uma interface. 

Uma classe pode herdar apenas de uma classe. No entanto, ele pode implementar várias interfaces.

Para definir uma classe que implementa uma interface, você usa a  implementspalavra-chave da seguinte forma:

<?php

interface MyInterface
{
	const CONSTANT_NAME = 1;

	public function methodName();
}

class MyClass implements MyInterface
{
	public function methodName()
	{
		// ...
	}
}
Linguagem de código:  HTML, XML  ( xml )

Quando uma classe implementa uma interface, ela é chamada de classe concreta . A classe concreta precisa implementar todos os métodos da interface.

Assim como uma classe , uma interface pode estender outra interface usando a extendspalavra-chave. O exemplo a seguir mostra como a Documentinterface estende a Readableinterface:

interface Readable
{
	public function read();
}

interface Document extends Readable
{
	public function getContents();
}
Linguagem de código:  PHP  ( php )

Por que você deve usar interfaces PHP?

A seguir estão os motivos para usar interfaces:

  • Ao implementar uma interface, o chamador do objeto precisa se preocupar apenas com a interface do objeto, e não com as implementações dos métodos do objeto. Portanto você pode alterar as implementações sem afetar o chamador da interface.
  • Uma interface permite que classes não relacionadas implementem o mesmo conjunto de métodos, independentemente de suas posições na hierarquia de herança de classes.
  • Uma interface permite modelar múltiplas heranças porque uma classe pode implementar mais de uma interface.

Exemplo de interface PHP

No exemplo a seguir, mostraremos como usar a interface para tornar o sistema mais flexível e fácil de estender. Suponha que você precise criar um criador de logs que possa registrar uma mensagem.

Primeiro, crie uma interface chamada Loggerassim:

<?php

interface Logger
{
	public function log($message);
}
Linguagem de código:  HTML, XML  ( xml )

Segundo, crie uma FileLogger classe que grave as mensagens de log em um arquivo:

<?php

interface Logger
{
	public function log($message);
}

class FileLogger implements Logger
{
	private $handle;

	private $logFile;

	public function __construct($filename, $mode = 'a')
	{
		$this->logFile = $filename;
		// open log file for append
		$this->handle = fopen($filename, $mode)
				or die('Could not open the log file');
	}

	public function log($message)
	{
		$message = date('F j, Y, g:i a') . ': ' . $message . "\n";
		fwrite($this->handle, $message);
	}

	public function __destruct()
	{
		if ($this->handle) {
			fclose($this->handle);
		}
	}
}
Linguagem de código:  HTML, XML  ( xml )

Terceiro, use a FileLoggerclasse da seguinte maneira:

<?php

$logger = new FileLogger('./log.txt', 'w');
$logger->log('PHP interfae is awesome');Linguagem de código:  HTML, XML  ( xml )

O seguinte adiciona outro criador de logs que registra informações no banco de dados. Para fins de demonstração, tornamos a DatabaseLoggerclasse o mais simples possível:

<?php

class DatabaseLogger implements Logger
{
	public function log($message)
	{
		echo sprintf("Log %s to the database\n", $message);
	}
}Linguagem de código:  HTML, XML  ( xml )

E você pode adicionar facilmente outros tipos de registradores que implementam a Loggerinterface sem tocar nos registradores existentes.

O trecho de código a seguir demonstra como usar vários criadores de log ao mesmo tempo usando uma única ILoggerinterface:

$loggers = [
	new FileLogger('./log.txt'),
	new DatabaseLogger()
];

foreach ($loggers as $logger) {
	$logger->log('Log message');
}
Linguagem de código:  PHP  ( php )

Junte tudo.

<?php

interface Logger
{
	public function log($message);
}

class FileLogger implements Logger
{
	private $handle;

	private $logFile;

	public function __construct($filename, $mode = 'a')
	{
		$this->logFile = $filename;
		// open log file for append
		$this->handle = fopen($filename, $mode)
				or die('Could not open the log file');
	}

	public function log($message)
	{
		$message = date('F j, Y, g:i a') . ': ' . $message . "\n";
		fwrite($this->handle, $message);
	}

	public function __destruct()
	{
		if ($this->handle) {
			fclose($this->handle);
		}
	}
}

class DatabaseLogger implements Logger
{
	public function log($message)
	{
		echo sprintf("Log %s to the database\n", $message);
	}
}

// examle 1
$logger = new FileLogger('./log.txt', 'w');
$logger->log('PHP interfae is awesome');

// example 2
$loggers = [
	new FileLogger('./log.txt'),
	new DatabaseLogger()
];

foreach ($loggers as $logger) {
	$logger->log('Log message');
}
Linguagem de código:  HTML, XML  ( xml )

Observe que no aplicativo do mundo real, você deve separar interfaces e classes em arquivos separados.

Resumo

  • A interface PHP fornece um contrato para outras classes seguirem (ou implementarem).

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *