2010-07-07 23 views
54

Otros idiomas con declaración automática de variables, como Perl, tienen un modo estricto.Modo estricto en PHP?

Al activar este modo estricto, se requiere declaración de variable, y Perl arroja un error tan pronto como intenta utilizar una variable no declarada.

¿Tiene PHP alguna característica similar?

+1

Desde la versión 7 [PHP es compatible con el modo estricto] (http://php.net/manual/en/migration70.new-features.php), sólo hay que poner 'declare (strict_types = 1); 'en la parte superior de cada uno (y cada) archivo de script, antes de la declaración del espacio de nombres. – Code4R7

+0

@ Code4R7 Ese es un tipo diferente de modo estricto que el que se pregunta en la pregunta. – Flimm

+0

Es cierto. Vuelva a 'error_reporting (E_STRICT);'. – Code4R7

Respuesta

60

más o menos. Puede activar el nivel E_NOTICE en su error reporting. (Lista de constantes here.)

Cada instancia de uso de una variable no declarada generará un E_NOTICE.

El E_STRICT error livel también arrojará esos avisos, así como otros consejos sobre cómo optimizar su código.

error_reporting(E_STRICT); 

Terminar el guión

Si usted es realmente serio, y quiere que su secuencia de comandos para terminar en lugar de sólo la salida de un aviso cuando se enfrentan a una variable no declarada, se podría construir una custom error handler.

Ejemplo de trabajo que sólo se ocupa de todo aviso "Undefined variable" en ellos y pasa todo lo demás en el gestor de errores de PHP por defecto:

<?php 

error_reporting(E_STRICT); 

function terminate_missing_variables($errno, $errstr, $errfile, $errline) 
{        
    if (($errno == E_NOTICE) and (strstr($errstr, "Undefined variable"))) 
    die ("$errstr in $errfile line $errline"); 

    return false; // Let the PHP error handler handle all the rest 
} 

$old_error_handler = set_error_handler("terminate_missing_variables"); 

echo $test; // Will throw custom error 

xxxx(); // Will throw standard PHP error 

?> 
+0

sí, es una especie de, pero no en su conjunto, como otros lenguajes de tipo estricto. – Sarfraz

+1

@sAc yup, hay otras cosas que se envían como avisos también, por lo que también aparecerán cuando enciendas esto. (Y obviamente, no es tan estricto como en un lenguaje fuertemente tipado.) –

+0

¡Gracias a tu código funciona excelente! Cambié 'die' en' throw' para redirigir la salida a la vista Zend Error Trace. – jantimon

3

Sí, escriba error_reporting(E_STRICT|E_ALL); al principio de su script.

+0

Solo antes de PHP 5.4.0, necesita 'E_STRICT' explícitamente. Ver http://php.net/manual/en/function.error-reporting.php donde 'E_STRICT' se volvió parte de' E_ALL' desde 5.4.0. – Roland

1

PHP es advertencia acerca de las variables no declaradas por defecto, sólo tiene para subir el nivel error reporting para ver los avisos. Sin embargo, tenga en cuenta que dado que no existe una sintaxis especial para declarar una variable en PHP y simplemente declara una asignándola, solo puede advertirle cuando intente utilizar el valor de una variable no declarada. Contrariamente a otros idiomas, "asignaciones a variables no declaradas" no existen, por lo que PHP no puede avisarte allí.

1

Uso

error_reporting(E_ALL); 

al comienzo de su código PHP. o ajuste el error_reporting en su archivo php.ini, para configurarlo para todos los archivos PHP

35

Uso

error_reporting(-1); 

para mostrar todos los errores posibles, incluyendo E_STRICT e incluso cuando se añaden nuevos niveles y constantes en las futuras versiones de PHP.

(Reference)

+5

+1 para esa cosa cosa -1 y futura compatibilidad. – Sarfraz

+1

Esto es increíble, gracias! –

+1

¿Es error_reporting (-1) lo mismo que error_reporting (E_STRICT)? – Pacerier

1

Se puede implementar su propia función de control de errores con set_error_handler().

Luego puede reaccionar a ciertos niveles de error como lo desee.

Por ejemplo, en lugar de solo mostrar y registrar un mensaje de error, puede finalizar el script si una variable no se declara correctamente o si se cumple alguna condición que no le agrade.

De esta forma puede aplicar una política muy estricta para cualquier código que se ejecute en su instancia de intérprete de PHP.

0

Sugeriría que los requisitos para informar y manejar errores difieren dentro de su entorno de desarrollo y su entorno de producción en vivo (WWW, Intranet de compañía, etc.). Durante el desarrollo, querrá ver tantos detalles como sea posible para encontrar y solucionar problemas.

En el entorno directo, creo que no desea mostrar mensajes de error PHP a los usuarios, sino permitir que el script continúe con funcionalidad reducida (por ejemplo, un mensaje como "Lo sentimos, no podemos actualizar su perfil en el momento ", o redirigir al usuario a la página de inicio, etc.). Una forma de lograr esto sería mediante el uso de manipuladores de errores personalizados para cada entorno

+0

Implementé el código Pekkas en mis etapas de prueba/desarrollo. – jantimon

Cuestiones relacionadas