xref: /web-php/releases/8.0/pt_BR.php (revision c093fb53)
1<?php
2$_SERVER['BASE_PAGE'] = 'releases/8.0/pt_BR.php';
3include_once __DIR__ . '/common.php';
4
5releases\php80\common_header(
6    'PHP 8.0 é uma atualização importante da linguagem PHP. ' .
7    'Ela contém muitos novos recursos e otimizações, ' .
8    'incluindo argumentos nomeados, união de tipos, atributos, ' .
9    'promoção de propriedade do construtor, expressão match, ' .
10    'operador nullsafe, JIT e melhorias no sistema de tipos, ' .
11    'tratamento de erros e consistência.');
12
13?>
14    <section class="php8-section php8-section_dark php8-section_header center">
15        <div class="page-tools">
16            <div class="change-language">
17                <?php releases\php80\language_chooser('pt_BR'); ?>
18            </div>
19        </div>
20        <div class="php8-section__content">
21            <div class="php8-logo">
22                <img src="/images/php8/logo_php8.svg" alt="php8" height="126" width="343">
23            </div>
24            <div class="php8-title">Released!</div>
25            <div class="php8-subtitle">
26                PHP 8.0 é uma atualização importante da linguagem PHP. <br class="display-none-md"> Ela contém muitos novos
27                recursos e otimizações, incluindo argumentos nomeados, união de tipos, atributos, promoção de propriedade do
28                construtor, expressão match, operador nullsafe, JIT e melhorias no sistema de tipos, tratamento de
29                erros e consistência.
30            </div>
31            <div class="php8-button-wrapper center">
32                <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a>
33            </div>
34        </div>
35    </section>
36
37    <section class="php8-section center">
38        <div class="php8-compare">
39            <h2 class="php8-h2" id="named-arguments">
40                Argumentos nomeados
41                <a class="php8-rfc" href="https://wiki.php.net/rfc/named_params">RFC</a>
42            </h2>
43            <div class="php8-compare__main">
44                <div class="php8-compare__block example-contents">
45                    <div class="php8-compare__label">PHP 7</div>
46                    <div class="php8-code phpcode">
47                        <?php highlight_php_trimmed(
48                            'htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, \'UTF-8\', false);',
49                        );?>
50                    </div>
51                </div>
52                <div class="php8-compare__arrow"></div>
53                <div class="php8-compare__block example-contents">
54                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
55                    <div class="php8-code phpcode">
56                        <?php highlight_php_trimmed(
57                            'htmlspecialchars($string, double_encode: false);',
58                        );?>
59                    </div>
60                </div>
61            </div>
62            <div class="php8-compare__content">
63                <ul>
64                    <li>Especifique apenas os parâmetros obrigatórios, pulando os opcionais.</li>
65                    <li>Os argumentos são independentes da ordem e autodocumentados.</li>
66                </ul>
67            </div>
68        </div>
69
70        <div class="php8-compare">
71            <h2 class="php8-h2" id="attributes">
72                Atributos
73                <a class="php8-rfc" href="https://wiki.php.net/rfc/attributes_v2">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/language.attributes.php">Doc</a>
74            </h2>
75            <div class="php8-compare__main">
76                <div class="php8-compare__block example-contents">
77                    <div class="php8-compare__label">PHP 7</div>
78                    <div class="php8-code phpcode">
79                        <?php highlight_php_trimmed(
80                            'class PostsController
81{
82    /**
83     * @Route("/api/posts/{id}", methods={"GET"})
84     */
85    public function get($id) { /* ... */ }
86}',
87                        );?>
88                    </div>
89                </div>
90                <div class="php8-compare__arrow"></div>
91                <div class="php8-compare__block example-contents">
92                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
93                    <div class="php8-code phpcode">
94                        <?php highlight_php_trimmed(
95                            'class PostsController
96{
97    #[Route("/api/posts/{id}", methods: ["GET"])]
98    public function get($id) { /* ... */ }
99}',
100                        );?>
101                    </div>
102                </div>
103            </div>
104            <div class="php8-compare__content">
105                <p>Em vez de anotações PHPDoc, agora você pode usar metadados estruturados com a sintaxe nativa do PHP.</p>
106            </div>
107        </div>
108
109        <div class="php8-compare">
110            <h2 class="php8-h2" id="constructor-property-promotion">
111                Promoção de propriedade de construtor
112                <a class="php8-rfc" href="https://wiki.php.net/rfc/constructor_promotion">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/language.oop5.decon.php#language.oop5.decon.constructor.promotion">Doc</a>
113            </h2>
114            <div class="php8-compare__main">
115                <div class="php8-compare__block example-contents">
116                    <div class="php8-compare__label">PHP 7</div>
117                    <div class="php8-code phpcode">
118                        <?php highlight_php_trimmed(
119                            'class Point {
120  public float $x;
121  public float $y;
122  public float $z;
123
124  public function __construct(
125    float $x = 0.0,
126    float $y = 0.0,
127    float $z = 0.0
128  ) {
129    $this->x = $x;
130    $this->y = $y;
131    $this->z = $z;
132  }
133}',
134                        );?>
135                    </div>
136                </div>
137                <div class="php8-compare__arrow"></div>
138                <div class="php8-compare__block example-contents">
139                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
140                    <div class="php8-code phpcode">
141                        <?php highlight_php_trimmed(
142                            'class Point {
143  public function __construct(
144    public float $x = 0.0,
145    public float $y = 0.0,
146    public float $z = 0.0,
147  ) {}
148}',
149                        );?>
150                    </div>
151                </div>
152            </div>
153            <div class="php8-compare__content">
154                <p>Menos código boilerplate para definir e inicializar propriedades.</p>
155            </div>
156        </div>
157
158        <div class="php8-compare">
159            <h2 class="php8-h2" id="union-types">
160                União de tipos
161                <a class="php8-rfc" href="https://wiki.php.net/rfc/union_types_v2">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/language.types.declarations.php#language.types.declarations.composite.union">Doc</a>
162            </h2>
163            <div class="php8-compare__main">
164                <div class="php8-compare__block example-contents">
165                    <div class="php8-compare__label">PHP 7</div>
166                    <div class="php8-code phpcode">
167                        <?php highlight_php_trimmed(
168                            'class Number {
169  /** @var int|float */
170  private $number;
171
172  /**
173   * @param float|int $number
174   */
175  public function __construct($number) {
176    $this->number = $number;
177  }
178}
179
180new Number(\'NaN\'); // Ok',
181                        );?>
182                    </div>
183                </div>
184                <div class="php8-compare__arrow"></div>
185                <div class="php8-compare__block example-contents">
186                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
187                    <div class="php8-code phpcode">
188                        <?php highlight_php_trimmed(
189                            'class Number {
190  public function __construct(
191    private int|float $number
192  ) {}
193}
194
195new Number(\'NaN\'); // TypeError',
196                        );?>
197                    </div>
198                </div>
199            </div>
200            <div class="php8-compare__content">
201                <p>Em vez de anotações PHPDoc para uma combinação de tipos, você pode usar declarações de união de tipos nativa
202                    que são validados em tempo de execução.</p>
203            </div>
204        </div>
205
206        <div class="php8-compare">
207            <h2 class="php8-h2" id="match-expression">
208                Expressão match
209                <a class="php8-rfc" href="https://wiki.php.net/rfc/match_expression_v2">RFC</a> <a class="php8-rfc" href="/manual/pt_BR/control-structures.match.php">Doc</a>
210            </h2>
211            <div class="php8-compare__main">
212                <div class="php8-compare__block example-contents">
213                    <div class="php8-compare__label">PHP 7</div>
214                    <div class="php8-code phpcode">
215                        <?php highlight_php_trimmed(
216                            'switch (8.0) {
217  case \'8.0\':
218    $result = "Oh no!";
219    break;
220  case 8.0:
221    $result = "This is what I expected";
222    break;
223}
224echo $result;
225//> Oh no!',
226                        );?>
227                    </div>
228                </div>
229                <div class="php8-compare__arrow"></div>
230                <div class="php8-compare__block example-contents">
231                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
232                    <div class="php8-code phpcode">
233                        <?php highlight_php_trimmed(
234                            'echo match (8.0) {
235  \'8.0\' => "Oh no!",
236  8.0 => "This is what I expected",
237};
238//> This is what I expected',
239                        );?>
240                    </div>
241                </div>
242            </div>
243            <div class="php8-compare__content">
244                <p>A nova expressão match é semelhante ao switch e tem os seguintes recursos:</p>
245                <ul>
246                    <li>Match é uma expressão, o que significa que seu resultado pode ser armazenado em uma variável ou
247                        retornado.</li>
248                    <li>Match suporta apenas expressões de uma linha e não precisa de uma declaração break;.</li>
249                    <li>Match faz comparações estritas.</li>
250                </ul>
251            </div>
252        </div>
253
254        <div class="php8-compare">
255            <h2 class="php8-h2" id="nullsafe-operator">
256                Operador nullsafe
257                <a class="php8-rfc" href="https://wiki.php.net/rfc/nullsafe_operator">RFC</a>
258            </h2>
259            <div class="php8-compare__main">
260                <div class="php8-compare__block example-contents">
261                    <div class="php8-compare__label">PHP 7</div>
262                    <div class="php8-code phpcode">
263                        <?php highlight_php_trimmed(
264                            '$country =  null;
265
266if ($session !== null) {
267  $user = $session->user;
268
269  if ($user !== null) {
270    $address = $user->getAddress();
271
272    if ($address !== null) {
273      $country = $address->country;
274    }
275  }
276}',
277                        );?>
278                    </div>
279                </div>
280                <div class="php8-compare__arrow"></div>
281                <div class="php8-compare__block example-contents">
282                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
283                    <div class="php8-code phpcode">
284                        <?php highlight_php_trimmed(
285                            '$country = $session?->user?->getAddress()?->country;',
286                        );?>
287                    </div>
288                </div>
289            </div>
290            <div class="php8-compare__content">
291                <p>Em vez de verificar condições nulas, agora você pode usar uma cadeia de chamadas com o novo operador nullsafe.
292                    Quando a avaliação de um elemento da cadeia falha, a execução de toda a cadeia é abortada e toda a cadeia é
293                    avaliada como nula.</p>
294            </div>
295        </div>
296
297        <div class="php8-compare">
298            <h2 class="php8-h2" id="saner-string-to-number-comparisons">
299                Comparações mais inteligentes entre strings e números
300                <a class="php8-rfc" href="https://wiki.php.net/rfc/string_to_number_comparison">RFC</a>
301            </h2>
302            <div class="php8-compare__main">
303                <div class="php8-compare__block example-contents">
304                    <div class="php8-compare__label">PHP 7</div>
305                    <div class="php8-code phpcode">
306                        <?php highlight_php_trimmed(
307                            '0 == \'foobar\' // true',
308                        );?>
309                    </div>
310                </div>
311                <div class="php8-compare__arrow"></div>
312                <div class="php8-compare__block example-contents">
313                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
314                    <div class="php8-code phpcode">
315                        <?php highlight_php_trimmed(
316                            '0 == \'foobar\' // false',
317                        );?>
318                    </div>
319                </div>
320            </div>
321            <div class="php8-compare__content">
322                <p>Ao comparar com uma string numérica, o PHP 8 usa uma comparação numérica. Caso contrário, ele converte o
323                    número em uma string e usa uma comparação de string.</p>
324            </div>
325        </div>
326
327        <div class="php8-compare">
328            <h2 class="php8-h2" id="consistent-type-errors-for-internal-functions">
329                Erros consistentes para tipos de dados em funções internas
330                <a class="php8-rfc" href="https://wiki.php.net/rfc/consistent_type_errors">RFC</a>
331            </h2>
332            <div class="php8-compare__main">
333                <div class="php8-compare__block example-contents">
334                    <div class="php8-compare__label">PHP 7</div>
335                    <div class="php8-code phpcode">
336                        <?php highlight_php_trimmed(
337                            'strlen([]); // Warning: strlen() expects parameter 1 to be string, array given
338
339array_chunk([], -1); // Warning: array_chunk(): Size parameter expected to be greater than 0',
340                        );?>
341                    </div>
342                </div>
343                <div class="php8-compare__arrow"></div>
344                <div class="php8-compare__block example-contents">
345                    <div class="php8-compare__label php8-compare__label_new">PHP 8</div>
346                    <div class="php8-code phpcode">
347                        <?php highlight_php_trimmed(
348                            'strlen([]); // TypeError: strlen(): Argument #1 ($str) must be of type string, array given
349
350array_chunk([], -1); // ValueError: array_chunk(): Argument #2 ($length) must be greater than 0',
351                        );?>
352                    </div>
353                </div>
354            </div>
355            <div class="php8-compare__content">
356                <p>A maioria das funções internas agora lançam uma exceção Error se a validação do parâmetro falhar.</p>
357            </div>
358        </div>
359    </section>
360
361    <section class="php8-section php8-section_light">
362        <h2 class="php8-h2">Compilação Just-In-Time</h2>
363        <p>
364            PHP 8 apresenta dois motores de compilação JIT. Tracing JIT, o mais promissor dos dois, mostra desempenho cerca de
365            3 vezes melhor em benchmarks sintéticos e melhoria de 1,5 a 2 vezes em alguns aplicativos específicos de longa
366            execução. O desempenho típico das aplicações está no mesmo nível do PHP 7.4.
367        </p>
368        <h3 class="php8-h3">
369          Relative JIT contribution to PHP 8 performance
370        </h3>
371        <p>
372            <img src="/images/php8/scheme.svg" width="900" alt="Just-In-Time compilation">
373        </p>
374
375        <div class="php8-columns">
376            <div class="php8-column">
377                <h2 class="php8-h2 php8-h2_margin-top">Melhorias no sistema de tipo e tratamento de erros</h2>
378                <ul>
379                    <li>
380                        Verificações de tipo mais rígidas para operadores aritméticos / bit a bit
381                        <a href="https://wiki.php.net/rfc/arithmetic_operator_type_checks">RFC</a>
382                    </li>
383                    <li>
384                        Validação de método abstrato em traits
385                        <a href="https://wiki.php.net/rfc/abstract_trait_method_validation">RFC</a>
386                    </li>
387                    <li>
388                        Assinaturas corretas de métodos mágicos <a href="https://wiki.php.net/rfc/magic-methods-signature">RFC</a>
389                    </li>
390                    <li>
391                        Avisos de motor reclassificados <a href="https://wiki.php.net/rfc/engine_warnings">RFC</a>
392                    </li>
393                    <li>
394                        Erro fatal para assinaturas de método incompatíveis <a href="https://wiki.php.net/rfc/lsp_errors">RFC</a>
395                    </li>
396                    <li>
397                        O operador @ não silencia mais os erros fatais.
398                    </li>
399                    <li>
400                        Herança com métodos privados <a href="https://wiki.php.net/rfc/inheritance_private_methods">RFC</a>
401                    </li>
402                    <li>
403                        Tipo mixed <a href="https://wiki.php.net/rfc/mixed_type_v2">RFC</a>
404                    </li>
405                    <li>
406                        Tipo de retorno static <a href="">RFC</a>
407                    </li>
408                    <li>
409                        Tipagem de funções internas
410                        <a href="https://externals.io/message/106522">Discussão por email</a>
411                    </li>
412                    <li>
413                        Objetos opacos em vez de recursos para
414                        <a href="https://php.watch/versions/8.0/resource-CurlHandle">Curl</a>,
415                        <a href="https://php.watch/versions/8.0/gdimage">Gd</a>,
416                        <a href="https://php.watch/versions/8.0/sockets-sockets-addressinfo">Sockets</a>,
417                        <a href="https://php.watch/versions/8.0/OpenSSL-resource">OpenSSL</a>,
418                        <a href="https://php.watch/versions/8.0/xmlwriter-resource">XMLWriter</a>, e
419                        <a href="https://php.watch/versions/8.0/xmlwriter-resource">XML</a>
420                        extensões
421                    </li>
422                </ul>
423            </div>
424            <div class="php8-column">
425              <h2 class="php8-h2 php8-h2_margin-top">Outros ajustes e melhorias de sintaxe</h2>
426                <ul>
427                    <li>
428                      Permitir vírgula no final da lista de parâmetros
429                      <a href="https://wiki.php.net/rfc/trailing_comma_in_parameter_list">RFC</a> e listas de uso em closures
430                      <a href="https://wiki.php.net/rfc/trailing_comma_in_closure_use_list">RFC</a>
431                    </li>
432                    <li>
433                      Catches sem variável na captura de exceção <a href="https://wiki.php.net/rfc/non-capturing_catches">RFC</a>
434                    </li>
435                    <li>
436                      Ajustes de sintaxe para variáveis <a href="https://wiki.php.net/rfc/variable_syntax_tweaks">RFC</a>
437                    </li>
438                    <li>
439                      Tratamento de nomes de namespace como token único
440                      <a href="https://wiki.php.net/rfc/namespaced_names_as_token">RFC</a>
441                    </li>
442                    <li>
443                      Throw como expressão <a href="https://wiki.php.net/rfc/throw_expression">RFC</a>
444                    </li>
445                    <li>
446                      Permitir ::class em objetos <a href="https://wiki.php.net/rfc/class_name_literal_on_object">RFC</a>
447                    </li>
448                </ul>
449
450                <h2 class="php8-h2 php8-h2_margin-top">Novas classes, interfaces e funções</h2>
451                <ul>
452                    <li>
453                        Classe <a href="https://wiki.php.net/rfc/weak_maps">Weak Map</a>
454                    </li>
455                    <li>
456                        Interface <a href="https://wiki.php.net/rfc/stringable">Stringable</a>
457                    </li>
458                    <li>
459                        <a href="https://wiki.php.net/rfc/str_contains">str_contains()</a>,
460                        <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_starts_with()</a>,
461                        <a href="https://wiki.php.net/rfc/add_str_starts_with_and_ends_with_functions">str_ends_with()</a>
462                    </li>
463                    <li>
464                        <a href="https://github.com/php/php-src/pull/4769">fdiv()</a>
465                    </li>
466                    <li>
467                        <a href="https://wiki.php.net/rfc/get_debug_type">get_debug_type()</a>
468                    </li>
469                    <li>
470                        <a href="https://github.com/php/php-src/pull/5427">get_resource_id()</a>
471                    </li>
472                    <li>
473                        <a href="https://wiki.php.net/rfc/token_as_object">token_get_all()</a> implementado com objetos
474                    </li>
475                    <li>
476                        <a href="https://wiki.php.net/rfc/dom_living_standard_api">New DOM Traversal and Manipulation APIs</a>
477                    </li>
478                </ul>
479            </div>
480        </div>
481    </section>
482
483    <section class="php8-section php8-section_dark php8-section_footer php8-footer">
484        <div class="php8-section__content">
485            <h2 class="php8-h2 center">
486                Obtenha melhoria de desempenho gratuita.<br class="display-none-lg display-block-md">
487                Obtenha melhor sintaxe.<br class="display-block-lg display-none-md display-block-sm">
488                Obtenha mais segurança de tipos.
489            </h2>
490            <div class="php8-button-wrapper center">
491                <a class="php8-button php8-button_light" href="/downloads">Atualize para o PHP 8!</a>
492            </div>
493            <div class="php8-footer__content">
494                <p>
495                    Para downloads do código-fonte do PHP 8, visite a página de
496                    <a href="http://www.php.net/downloads">downloads</a>.
497                    Os binários do Windows podem ser encontrados na página <a href="http://windows.php.net/download">PHP para
498                        Windows</a>.
499                    A lista de mudanças é registrada no <a href="http://www.php.net/ChangeLog-8.php">ChangeLog</a>.
500                </p>
501                <p>
502                    O <a href="/manual/pt_BR/migration80.php">guia de migração</a> está disponível no Manual do PHP.
503                    Consulte-o para obter uma lista detalhada de novos recursos e alterações incompatíveis com versões anteriores.
504                </p>
505            </div>
506        </div>
507    </section>
508
509
510
511
512<?php site_footer();
513