Eu vi a seguinte nova linha no PHP 7, mas ninguém realmente explica o que isso significa. Eu pesquisei no Google e tudo o que eles falam é que você estará ativando ou não como um tipo de pesquisa.
declare(strict_types = 1);
O que isso faz? Como isso afeta meu código? Devo fazer isso?
Alguma explicação seria legal.
php
php-7.2
strong-typing
weak-typing
sufuko
fonte
fonte
Respostas:
No blog Treehouse :
Por padrão, o PHP converterá valores do tipo errado no tipo escalar esperado, se possível. Por exemplo, uma função que recebe um número inteiro para um parâmetro que espera uma string obterá uma variável do tipo string.
Tipos estritos desativados ( eval ):
É possível ativar o modo estrito por arquivo. No modo estrito, apenas uma variável do tipo exato da declaração de tipo será aceita ou um TypeError será lançado. A única exceção a essa regra é que um número inteiro pode ser dado a uma função esperando um float. As chamadas de função de dentro das funções internas não serão afetadas pela declaração strict_types.
Para ativar o modo estrito, a declaração declare é usada com a declaração strict_types:
Tipos estritos ativados ( eval ):
Exemplo de trabalho:
fonte
strict_types
afeta a coerção do tipo.Usar dicas de tipo sem
strict_types
pode levar a erros sutis.Antes de tipos estritos,
int $x
significava "$x
deve ter um valor coercível a um int". Qualquer valor que pudesse ser coagido a umint
passaria a dica de tipo, incluindo:242
),10.17
),true
),null
ou"13 Ghosts"
).Ao definir
strict_types=1
, você diz ao mecanismo queint $x
significa "$ x deve ser apenas um int apropriado, nenhum tipo de coerção é permitido". Você tem muita certeza de que está recebendo exatamente e apenas o que foi dado, sem nenhuma conversão e perda potencial.Exemplo:
Rende um resultado potencialmente confuso:
A maioria dos desenvolvedores esperaria, eu acho, uma
int
dica para significar "apenas um int". Mas não, significa "qualquer coisa como um int". A ativação de strict_types fornece o provável comportamento esperado e desejado:Rendimentos:
Eu acho que há duas lições aqui, se você usar dicas de tipo:
strict_types=1
sempre.strict_types
pragma.fonte
strict_types
.