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 interface
palavra-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 implements
palavra-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 extends
palavra-chave. O exemplo a seguir mostra como a Document
interface estende a Readable
interface:
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 Logger
assim:
<?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 FileLogger
classe 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 DatabaseLogger
classe 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 Logger
interface 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 ILogger
interface:
$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).