He visto la siguiente nueva línea en PHP 7, pero nadie realmente explica lo que significa. Lo busqué en Google y de lo único que hablan es si lo habilitarás o no como una encuesta.
declare(strict_types = 1);
¿Qué hace? ¿Cómo afecta mi código? ¿Debería hacerlo?
Alguna explicación estaría bien.
php
php-7.2
strong-typing
weak-typing
sufuko
fuente
fuente
Respuestas:
Del blog Treehouse :
Por defecto, PHP lanzará valores del tipo incorrecto en el tipo escalar esperado si es posible. Por ejemplo, una función que recibe un número entero para un parámetro que espera una cadena obtendrá una variable de tipo cadena.
Tipos estrictos deshabilitados ( eval ):
Es posible habilitar el modo estricto por archivo. En modo estricto, solo se aceptará una variable de tipo exacto de la declaración de tipo, o se lanzará un TypeError. La única excepción a esta regla es que se puede dar un número entero a una función que espera un flotante. Las llamadas a funciones desde las funciones internas no se verán afectadas por la declaración estricta_tipos.
Para habilitar el modo estricto, la declaración de declaración se usa con la declaración estricta_tipos:
Tipos estrictos habilitados ( eval ):
Ejemplo de trabajo:
fuente
strict_types
afecta la coerción de tipo.El uso de sugerencias de tipo sin
strict_types
puede provocar errores sutiles.Antes de los tipos estrictos,
int $x
significaba "$x
debe tener un valor coercible para un int". Cualquier valor que se pueda forzar a anint
pasaría la sugerencia de tipo, que incluye:242
),10.17
),true
),null
o"13 Ghosts"
).Al configurar
strict_types=1
, le dice al motor queint $x
significa "$ x solo debe ser una int int, no se permite ninguna coerción de tipo". Tiene una gran seguridad de que está obteniendo exactamente y solo lo que se le dio, sin ninguna conversión y pérdida potencial.Ejemplo:
Produce un resultado potencialmente confuso:
La mayoría de los desarrolladores esperarían, creo, una
int
pista que significa "solo un int". Pero no lo hace, significa "algo así como un int". Habilitar estricta_tipos proporciona el comportamiento probable esperado y deseado:Rendimientos:
Creo que hay dos lecciones aquí, si usa sugerencias de tipo:
strict_types=1
, siempre.strict_types
pragma.fuente
strict_types
.