You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -8,41 +8,183 @@ Os construtores e destrutores são metódos mágicos que executam determinadas t
8
8
9
9
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.
10
10
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:
12
49
13
50
```php
14
-
class Pessoa
51
+
// Player.php
52
+
53
+
class Player
15
54
{
16
55
17
-
public $nome;
56
+
public string $username; // propriedade/atributo
57
+
private string $password; // propriedade/atributo
58
+
protected float $money; // propriedade/atributo
18
59
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)
20
64
{
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
23
68
}
24
69
}
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.
25
80
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
+
}
29
104
```
30
105
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
+
31
150
### Destrutores
32
151
33
152
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`.
34
153
35
154
```php
36
-
class Pessoa
155
+
class Player
37
156
{
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)
39
164
{
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!";
41
175
}
42
176
}
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:
0 commit comments