Skip to content

Commit 618132d

Browse files
authored
Merge pull request #84 from DanielHe4rt/chore/poo-constructors
chore: melhorias e exemplificações nos construtores
2 parents 2063e85 + 016aaf1 commit 618132d

File tree

1 file changed

+156
-14
lines changed

1 file changed

+156
-14
lines changed

4-Intermediário/2-Construtores-e-destrutores.md

Lines changed: 156 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,41 +8,183 @@ Os construtores e destrutores são metódos mágicos que executam determinadas t
88

99
Os construtores são especificados por um metódo chamado `__construct` e são executados sempre que a classe é chamada. Você pode por exemplo, atribuir valores não-primitivos a atributos da classe antes de executar qualquer ação, o que não seria possível sem um construtor.
1010

11-
Vamos imaginar a classe `Pessoa`, iremos um atributo `nome` para ele e o seu construtor. Queremos que seu nome esteja sempre tenha a primeira letra maíscula, então faremos essa tratativa no construtor
11+
Vamos imaginar a classe `Player`, que contem os atributos base de um personagem de um
12+
jogo: `username`, `password`, `money`. Quando criamos um novo objeto de uma classe e você tem um
13+
construtor, ele é tido como uma "função" que recebe os parâmetros. Olhe a classe abaixo:
14+
```php
15+
// Player.php
16+
17+
class Player
18+
{
19+
20+
public string $username; // propriedade/atributo
21+
private string $password; // propriedade/atributo
22+
protected float $money; // propriedade/atributo
23+
24+
/**
25+
* Método mágico: construtor
26+
*/
27+
public function __construct(string $username, string $password, float $money)
28+
{
29+
$this->username = $username; // Setter do Construtor
30+
$this->password = password_hash($password, PASSWORD_ARGON2I); // Setter do Construtor
31+
$this->money = $money; // Setter do Construtor
32+
}
33+
}
34+
```
35+
36+
Note que o construtor é uma função que recebe parâmetros na ordem que você quiser. E quando vamos
37+
instância-lá, usamos a palavra reservada `new` e o nome da classe `Player` e os parametros
38+
`('danielhe4rt','secret123', 1000)` na ordem que foram declaradas no escopo do construtor e atribuimos
39+
a uma variavel. Fica assim:
40+
41+
```php
42+
$danielhe4rt = new Player('danielhe4rt', 'secret123', 1000);
43+
```
44+
45+
Se você não passar algum dos parâmetros ou colocá-los fora de ordem, seu código apontará um erro
46+
falando que falta argumentos ou que os dados passados não **segem os mesmos tipos** (lembre-se de tipar os parametros de suas funções).
47+
48+
Caso você queira deixar um argumento opcional, você deverá atribuir um valor padrão pra eles. Se liga:
1249

1350
```php
14-
class Pessoa
51+
// Player.php
52+
53+
class Player
1554
{
1655

17-
public $nome;
56+
public string $username; // propriedade/atributo
57+
private string $password; // propriedade/atributo
58+
protected float $money; // propriedade/atributo
1859

19-
public function __construct($nome)
60+
/**
61+
* Método mágico: construtor
62+
*/
63+
public function __construct(string $username, string $password, float $money = 1500.0)
2064
{
21-
$this->nome = ucfirst($nome);
22-
echo "Olá, meu nome é {$this->nome}";
65+
$this->username = $username; // Setter do Construtor
66+
$this->password = password_hash($password, PASSWORD_ARGON2I); // Setter do Construtor
67+
$this->money = $money; // Setter do Construtor
2368
}
2469
}
70+
```
71+
72+
```php
73+
// Instancia sem o valor do atributo money
74+
$danielhe4rt = new Player('danielhe4rt', 'secret123');
75+
```
76+
77+
Ele não foi necessário porquê falamos em nosso construtor que:
78+
- Se não for passado o valor do atributo money, coloque-o como **1500.0** (valor padrão).
79+
- Se for passado o valor do atributo money, sobrescreva o valor padrão de **1500.0** pelo valor passado na variavel.
2580

26-
//Agora, quando formos instânciar a classe pessoa, passaremos seu nome como um argumento
27-
$pessoa = new Pessoa('joão');
28-
//Olá, meu nome é João
81+
Uma coisa bem importante sobre os atributos padrões em construtores é que eles devem ser declarados
82+
da direita para a esquerda. Entenda o caso abaixo:
83+
84+
```php
85+
// Player.php
86+
87+
class Player
88+
{
89+
90+
public string $username; // propriedade/atributo
91+
private string $password; // propriedade/atributo
92+
protected float $money; // propriedade/atributo
93+
94+
/**
95+
* Método mágico: construtor
96+
*/
97+
public function __construct(string $username = 'danielhe4rt', string $password, float $money = 1500.0)
98+
{
99+
$this->username = $username; // Setter do Construtor
100+
$this->password = password_hash($password, PASSWORD_ARGON2I); // Setter do Construtor
101+
$this->money = $money; // Setter do Construtor
102+
}
103+
}
29104
```
30105

106+
```php
107+
// Instancia sem o valor do atributo username
108+
$danielhe4rt = new Player('secret123', 99999);
109+
```
110+
111+
Esse código acima geraria um erro assim que a classe for lida pois se há mais de 1 argumento
112+
e o primeiro dos argumentos tiver um valor padrão e o segundo não, ele **não saberá como interpretar**
113+
já que a declaração começa da esquerda para a direita.
114+
115+
Como poderiamos fazer esse cenário dar certo? Colocando os valores padrões a direita do escopo
116+
do construtor e os que não tiverem valores padrões à esquerda.
117+
118+
```php
119+
// Player.php
120+
121+
class Player
122+
{
123+
124+
public string $username; // propriedade/atributo
125+
private string $password; // propriedade/atributo
126+
protected float $money; // propriedade/atributo
127+
128+
/**
129+
* Método mágico: construtor
130+
*/
131+
public function __construct(string $password, string $username = 'danielhe4rt', float $money = 1500.0)
132+
{
133+
$this->username = $username; // Setter do Construtor
134+
$this->password = password_hash($password, PASSWORD_ARGON2I); // Setter do Construtor
135+
$this->money = $money; // Setter do Construtor
136+
}
137+
}
138+
```
139+
140+
```php
141+
// Instancia sem o valor do atributo username e o money
142+
$danielhe4rt = new Player('secret123');
143+
144+
$danielhe4rt->username; // danielhe4rt
145+
$danielhe4rt->money; // 1500.0
146+
```
147+
148+
Construtores são bem simples assim que você entende algumas regras e há muito mais a ser explorado, mas vamos manter isso simples!
149+
31150
### Destrutores
32151

33152
Já os destrutores agem no momento oposto aos construtores, bem antes da classe ser removida da memória, sendo atribuídas `null` ou usando `unset`. Suas ações devem ser definidas no metódo `__destruct`.
34153

35154
```php
36-
class Pessoa
155+
class Player
37156
{
38-
public function __destruct()
157+
158+
public string $username; // propriedade/atributo
159+
160+
/**
161+
* Método mágico: construtor
162+
*/
163+
public function __construct(string $username)
39164
{
40-
echo 'Até mais!';
165+
$this->username = $username; // Setter do Construtor
166+
echo "Jogador Cadastrado!";
167+
}
168+
169+
/**
170+
* Método mágico: destrutor
171+
*/
172+
public function __destruct()
173+
{
174+
echo "Conta do jogador " . $this->username . " encerrada!";
41175
}
42176
}
177+
```
178+
Note que deixei a classe bem sucinta e coloquei um echo para quando a classe é construida e quando a varável que recebe
179+
o objeto é removido da memória para dar um exemplo de como acontece o processo. Se liga:
180+
181+
```php
182+
$danielhe4rt = new Player('danielhe4rt');
183+
// Jogador Cadastrado!
184+
185+
unset($danielhe4rt);
186+
// Conta do jogador danielhe4rt encerrad!
43187

44-
unset($pessoa);
45-
//Até mais!
46188
```
47189

48190
### Notas:

0 commit comments

Comments
 (0)