Interfaces de Objetos em PHP

Nenhum produto encontrado nessa seleção.

Interfaces de Objetos em PHP são entidades que definem os métodos que as classes delas originadas deverão possuir. Não se tratam de classes em si, mas um modelo para suas implementações (classes que virão a configurar seus métodos).

Se você leu nossa aula sobre Abstração de Classes em PHP (leitura recomendada), vai ver algumas similaridades sobre as Interfaces e as classes abstratas, porém, elas não são a mesma coisa.

Classes abstratas devem conter pelo menos um método abstrato (um método sem corpo), que será definido em suas classes filhas (subclasses).

<?php 
// Classe abstrata
abstract class Carro
{
	// Propriedades
	public $marca;
	
	// Método abstrato
	abstract public function motor( $modelo_motor );
}

class Marca extends Carro
{
	// Define o método abstrato
	public function motor( $modelo_motor ){
		echo $this->marca . ' ' . $modelo_motor;
	}
}

// Carro
$carro = new Marca();
$carro->marca = 'Gol';
$carro->motor('Modelo do motor'); // Gol Modelo do motor 
?>

Nas interfaces, por outro lado, todos os seus métodos são abstratos, portanto, uma implementação de uma interface, deverá contém a configuração de todos os métodos que ela estipular.

<?php 
// Interface
interface Carro
{
	// Método
	public function motor( $modelo_motor );
}

class Marca implements Carro
{
	// Propriedades
	public $marca;
	
	// Define o método abstrato
	public function motor( $modelo_motor ){
		echo $this->marca . ' ' . $modelo_motor;
	}
}

// Objeto de Marca, que é uma implementação de Carro
$carro = new Marca();
$carro->marca = 'Gol';
$carro->motor('Modelo do motor'); // Gol Modelo do motor 
?>

No trecho de código acima, você pode ver a criação e uma implementação de uma interface. Para a criação, utilizamos a palavra {php}interface{/php}, para a implementação (a classe que vai configurar os métodos definidos), utilizamos a palavra {php}implements{/php}.

Nas interfaces, você não pode configurar propriedades (variáveis membro), porém, é possível configurar constantes.

<?php 
// Interface
interface Carro
{
	// Constante
	const Valor = 22000;
	
	// Método
	public function motor( $modelo_motor );
}

class Marca implements Carro
{
	// Propriedades
	public $marca;
	
	// Define o método abstrato
	public function motor( $modelo_motor ){
		echo $this->marca . ' ' . $modelo_motor . ' ' . self::Valor;
	}
}

// Objeto de Marca, que é uma implementação de Carro
$carro = new Marca();
$carro->marca = 'Gol';
$carro->motor('Modelo do motor'); // Gol Modelo do motor 22000
?>

Você também pode estender interfaces sem preferir, veja:

<?php 
// Interface
interface Carro
{
	// Constante
	const Valor = 22000;
	
	// Método
	public function motor( $modelo_motor );
}

// Uma extensão da interface Carro
interface Novo extends Carro
{
	// Constante
	const Novo = false;
}

// Uma implementação da interface Novo
class Marca implements Novo
{
	// Propriedades
	public $marca;
	
	// Define o método abstrato
	public function motor( $modelo_motor ){
		if ( self::Novo === true ) {
			echo 'Novo: ' . $this->marca . ' ' . $modelo_motor . ' ' . self::Valor;
		} else {
			echo 'Usado: ' . $this->marca . ' ' . $modelo_motor . ' ' . self::Valor;
		}
	}
}

// Objeto de Marca, que é uma implementação de Carro
$carro = new Marca();
$carro->marca = 'Gol';
$carro->motor('Modelo do motor'); // Usado: Gol Modelo do motor 22000 
?>

Todos os métodos de uma interface deverão ter visibilidade {php}public{/php}.

Nas implementações de uma interface, você pode criar outros métodos se precisar, não há problemas nisso.

<?php 
// Interface
interface Carro
{
	// Constante
	const Valor = 22000;
	
	// Método
	public function motor( $modelo_motor );
}

// Uma extensão da interface Carro
interface Novo extends Carro
{
	// Constante
	const Novo = false;
}

// Uma implementação da interface Novo
class Marca implements Novo
{
	// Propriedades
	public $marca;
	
	// Define o método abstrato
	public function motor( $modelo_motor ){
		if ( self::Novo === true ) {
			echo 'Novo: ' . $this->marca . ' ' . $modelo_motor . ' ' . self::Valor;
		} else {
			echo 'Usado: ' . $this->marca . ' ' . $modelo_motor . ' ' . self::Valor;
		}
	}
	
	// Outro método
	public function MetodoDeTeste () {
		echo 'Funciona perfeitamente.';
	}
}

// Objeto de Marca, que é uma implementação de Carro
$carro = new Marca();
$carro->MetodoDeTeste(); // Funciona perfeitamente. 
?>

Conclusão

Uma interface basicamente descreve quais os métodos uma classe deve ter, porém, ela não especifica como tais métodos devem funcionar. Você simplesmente define que precisa que o método X e Y devem ser definidos, porém, a implementação (a classe) é quem vai dizer o que o método X deve fazer, e o que o método Y deve fazer.

Não deixe de seguir nosso curso de PHP gratuito e PHP orientado a objetos.

Em caso de dúvidas, não hesite em comentar.