Skip to content

Commit e6d20d0

Browse files
authored
Merge pull request #100 from Lucasm4sco/feature/interfaces
Add Interfaces-PHP
2 parents dbcb51e + b25559f commit e6d20d0

File tree

1 file changed

+251
-0
lines changed

1 file changed

+251
-0
lines changed

4-Intermediário/8-Interfaces.md

Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
# Interfaces
2+
Neste tópico abordaremos o assunto do que são interfaces no PHP e como implementá-las
3+
4+
## O que são interfaces?
5+
6+
<br>
7+
8+
Bom, para entendermos interfaces, vamos pegar uma definição da própria página do PHP:
9+
10+
> Interfaces de objetos permitem a criação de códigos que especificam quais métodos uma classe deve implementar, sem definir como esses métodos serão tratados.
11+
12+
<br>
13+
14+
***Mas então, o que isso significa?***
15+
16+
- Significa que interfaces são nada mais, nada menos do que modelos de métodos que podemos implementar em uma classe
17+
(ou até mesmo estende-lá em outra interface como veremos mais a seguir), e que ao fazer essa implementação a classe passa a ser obrigada à conter os métodos declarados
18+
na interface, resultando em um erro caso não seja feito;
19+
- Em outras palavras, podemos entender interfaces como um contrato, a partir do momento que você assina esse contrato (implementa ele), você passa a ser obrigado a
20+
seguir as especificações previstas nele, o descumprimento delas seria punitivo (que no nosso caso seria um erro fatal do código).
21+
22+
23+
A partir desse entendimento podemos seguir para o próximo assunto :arrow_down: <br>
24+
25+
## Como implementar uma interface?
26+
27+
<br>
28+
29+
Ao trabalharmos com interfaces, usaremos principalmente duas palavras reservadas próprias para o seu uso: ```interface``` e ```implements``` , onde:
30+
31+
- **interface:** Palavra reservada para definir a criação de uma interface;
32+
- **implements:** Operador usado para realizar a implementação de interfaces;
33+
34+
Veremos sobre sua síntaxe no código abaixo:
35+
36+
```php
37+
// sintaxe para a criação:
38+
interface ProvedorPagamentoInterface
39+
{
40+
// declaração de métodos
41+
}
42+
43+
// sintaxe para a implementação:
44+
class PaypalProvider implements ProvedorPagamentoInterface
45+
{
46+
// métodos e atributos da classe
47+
}
48+
```
49+
<br>
50+
51+
Agora para você entender melhor sobre seu uso, daremos alguns exemplos de como utilizar:
52+
53+
- **Implementação correta de uma interface:**
54+
55+
```php
56+
// criamos a interface HelloWorld:
57+
interface HelloWorld
58+
{
59+
// definimos que as classes que implementarem essa interface, deverá conter o método público helloWorld:
60+
public function helloWorld(): void
61+
}
62+
63+
64+
// criamos a classe Saudar e definimos que ela irá implementar a interface HelloWorld:
65+
class Saudar implements HelloWorld
66+
{
67+
public function helloWorld()
68+
{
69+
echo "Olá mundo!";
70+
}
71+
}
72+
73+
// instanciamos um objeto através da classe criada e o atribuimos para a váriavel cumprimentos:
74+
$cumprimentos = new Saudar();
75+
// acessamos e executamos o método recebido ao objeto:
76+
$cumprimentos->helloWorld();
77+
78+
```
79+
O output do código acima será: ```Olá mundo!```
80+
81+
<br>
82+
83+
- **Implementação errada de uma interface:**
84+
85+
```php
86+
// criamos a interface HelloWorld:
87+
interface HelloWorld
88+
{
89+
// definimos que as classes que implementarem essa interface, deverá conter o método público helloWorld:
90+
public function helloWorld();
91+
}
92+
93+
// criação da classe Somar e definimos que ela irá implementar a interface HelloWorld:
94+
class Somar implements HelloWorld
95+
{
96+
public function somar($n1, $n2)
97+
{
98+
return $n1 + $n2;
99+
}
100+
}
101+
102+
// instanciamos um objeto através da classe criada e o atribuimos para a váriavel metodosMatematicos:
103+
$metodosMatematicos = new Somar();
104+
// acessamos e executamos o método recebido ao objeto:
105+
echo $metodosMatematicos->somar(1,2);
106+
107+
```
108+
109+
Note que agora nosso código possui dois erros. O primeiro erro é semântico, onde estamos implementando uma interface com o método helloWorld em uma classe criada para o intuito de realizar somas, onde não faria tanto sentido a classe possuir esse método. E o segundo erro é que definimos a implementação da interface em uma classe que não contém o método definido na mesma, devido a isso é gerado um erro fatal pelo interpretador que impossibilita de executar o programa, tendo o seguinte output: ``` Fatal error: Class Somar contains 1 abstract method and must therefore be declared abstract or implement the remaining methods... ```.
110+
111+
<br>
112+
113+
- **Implementação de duas interfaces:**
114+
115+
Para implementarmos duas ou mais interfaces em uma mesma classe usaremos uma vírgula ```,``` para separarmos elas:
116+
117+
```php
118+
// criamos a interface Nome e definimos os métodos para ela:
119+
interface Nome
120+
{
121+
public function setNome($nome);
122+
public function getNome();
123+
}
124+
125+
// criamos a interface Idade e definimos seu métodos:
126+
interface Idade
127+
{
128+
public function setIdade($idade);
129+
public function getIdade();
130+
}
131+
132+
// criamos a classe Pessoa e definimos que ela deverá conter os métodos definidos nas interfaces Nome e Idade:
133+
class Pessoa implements Nome, Idade
134+
{
135+
private $nome;
136+
private $idade;
137+
138+
public function getNome()
139+
{
140+
return $this->nome;
141+
}
142+
143+
public function setNome($nome)
144+
{
145+
$this->nome = $nome;
146+
}
147+
148+
public function getIdade()
149+
{
150+
return $this->idade;
151+
}
152+
153+
public function setIdade($idade)
154+
{
155+
$this->idade = $idade;
156+
}
157+
158+
public static function apresentarPessoa($pessoa)
159+
{
160+
echo "Olá, eu me chamo {$pessoa->getNome()} e tenho {$pessoa->getIdade()} anos.";
161+
}
162+
}
163+
164+
// instanciamos um novo objeto através da classe Pessoa:
165+
$novaPessoa = new Pessoa();
166+
// atribuimos valores aos seus atributos com os setters:
167+
$novaPessoa->setNome('João');
168+
$novaPessoa->setIdade(36);
169+
// acessamos e executamos o método estático para apresentação de pessoas:
170+
Pessoa::apresentarPessoa($novaPessoa);
171+
```
172+
173+
A execução do código acima irá gerar o seguinte output: ```Olá, eu me chamo João e tenho 36 anos.```
174+
175+
<br>
176+
177+
- **Implementação interfaces estendíveis:**
178+
179+
Interfaces estendíveis são interfaces que recebem métodos por herança de outra através do operador ```extends``` (usado também em heranças de classes), veja um exemplo:
180+
181+
```php
182+
// definimos a interface CalculosBasicos e seus métodos:
183+
interface CalculosBasicos
184+
{
185+
public function somar($n1, $n2);
186+
public function subtrair($n1, $n2);
187+
}
188+
189+
// definimos a interface Matematica, seu métodos e que ela será um interface estendida de CalculosBasicos,
190+
// a partir de agora a classe que implementar Matematica deverá possuir tanto métodos definidos na própria
191+
// interface, quanto métodos definidos em Calculos Basicos;
192+
interface Matematica extends CalculosBasicos
193+
{
194+
public function calcularHipotenusa($cateto1, $cateto2);
195+
}
196+
197+
// definimos uma classe Matematico que implementa a interface estendível Matematica:
198+
class Matematico implements Matematica
199+
{
200+
public function somar($n1, $n2)
201+
{
202+
return $n1 + $n2;
203+
}
204+
205+
public function subtrair($n1, $n2)
206+
{
207+
return $n1 - $n2;
208+
}
209+
210+
public function calcularHipotenusa($cateto1, $cateto2)
211+
{
212+
// calculamos a hipotenusa e devolvemos seu valor
213+
$hipotenusa = ($cateto1**2 + $cateto2**2)**0.5;
214+
return $hipotenusa;
215+
}
216+
}
217+
218+
// instanciamos um objeto e acessamos seu atributos
219+
$professor = new Matematico();
220+
echo $professor->somar(2,4)."-"; // 6
221+
echo $professor->subtrair(12, 10)."-"; // 2
222+
// usamos o método number_format para mostrar apenas 2 casas decimais do resultado
223+
echo number_format($professor->calcularHipotenusa(12, 15), 2); // 19.21
224+
225+
```
226+
227+
Ao rodar o código acima, deverá sair o seguinte output: ```6-2-19.21```.
228+
229+
<br>
230+
231+
- **Usando constantes em interfaces:**
232+
233+
Apesar de não ser possível definir atributos para uma classe através de uma interface, o PHP permite a criação de constantes nessas estruturas, e caso essa constante não seja redeclarado, classes que implementarem essa interface também vão conseguir acessar essa constante, exemplo:
234+
235+
```php
236+
interface Exemplo
237+
{
238+
const testando = 'Valor em Exemplo';
239+
}
240+
241+
echo Exemplo::testando.' - ';
242+
243+
class ClasseTeste implements Exemplo
244+
{
245+
// ...
246+
}
247+
248+
echo ClasseTeste::testando;
249+
```
250+
251+
O código acima terá o output: ```Valor em Exemplo - Valor em Exemplo```.

0 commit comments

Comments
 (0)