¿POR QUÉ ESTÁ PASANDO ESTO?
Con el tiempo, PHP se ha convertido en un lenguaje más centrado en la seguridad. La configuración que solía estar desactivada de manera predeterminada ahora se activa de manera predeterminada. Un ejemplo perfecto de esto es E_STRICT
, que se activó por defecto a partir de PHP 5.4.0 .
Además, de acuerdo con la documentación de PHP, de forma predeterminada, E_NOTICE
está deshabilitado en php.ini. Los documentos PHP recomiendan activarlo con fines de depuración . Sin embargo, cuando descargo PHP desde el repositorio de Ubuntu, y desde la pila de Windows de BitNami, veo algo más.
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
Tenga en cuenta que en error_reporting
realidad se establece en el valor de producción de forma predeterminada, no en el valor "predeterminado" de forma predeterminada. Esto es algo confuso y no está documentado fuera de php.ini, por lo que no lo he validado en otras distribuciones.
Sin embargo, para responder a su pregunta, este error aparece ahora cuando no apareció antes porque:
Instaló PHP y la nueva configuración predeterminada está algo mal documentada pero no excluye E_NOTICE
.
E_NOTICE
advertencias como variables indefinidas e índices indefinidos realmente ayudan a que su código sea más limpio y seguro. Puedo decirte que, hace años, mantener E_NOTICE
habilitado me obligó a declarar mis variables. Hizo MUCHO más fácil aprender C, no declarar variables es mucho más molesto.
¿QUÉ PUEDO HACER AL RESPECTO?
Apague E_NOTICE
copiando el "Valor predeterminado" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
y reemplazándolo con lo que actualmente no está comentado después del inicio de sesión igual error_reporting =
. Reinicie Apache o PHP si usa CGI o FPM. Asegúrese de estar editando el php.ini "correcto". El correcto será Apache si está ejecutando PHP con Apache, fpm o php-fpm si está ejecutando PHP-FPM, cgi si está ejecutando PHP-CGI, etc. Este no es el método recomendado, pero si tiene código heredado ser extremadamente difícil de editar, entonces podría ser tu mejor apuesta.
Desactiva E_NOTICE
el nivel de archivo o carpeta. Esto podría ser preferible si tiene algún código heredado pero de lo contrario quiere hacer las cosas de la manera "correcta". Para hacer esto, debe consultar Apache2, Nginx o el servidor que elija. En Apache, usarías php_value
dentro de <Directory>
.
Reescribe tu código para estar más limpio. Si necesita hacer esto mientras se muda a un entorno de producción o no quiere que alguien vea sus errores, asegúrese de deshabilitar cualquier visualización de errores y solo registrar sus errores (vea display_errors
y log_errors
en php.ini y la configuración de su servidor) .
Para ampliar en la opción 3: Este es el ideal. Si puedes seguir esta ruta, deberías. Si no va por esta ruta inicialmente, considere mover esta ruta eventualmente probando su código en un entorno de desarrollo. Mientras lo hace, deshágase ~E_STRICT
y ~E_DEPRECATED
vea qué podría salir mal en el futuro. Verá MUCHOS errores desconocidos, pero evitará que tenga problemas desagradables cuando necesite actualizar PHP en el futuro.
¿Qué significan los errores?
Undefined variable: my_variable_name
- Esto ocurre cuando una variable no se ha definido antes de su uso. Cuando se ejecuta el script PHP, internamente solo asume un valor nulo. Sin embargo, ¿en qué escenario necesitaría verificar una variable antes de definirla? En última instancia, este es un argumento para el "código descuidado". Como desarrollador, puedo decirle que me encanta cuando veo un proyecto de código abierto donde las variables se definen tan alto en sus alcances como se pueden definir. Hace que sea más fácil saber qué variables aparecerán en el futuro y hace que sea más fácil leer / aprender el código.
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- Esto ocurre cuando intenta acceder a un valor en una matriz y no existe. Para evitar este error, realice una verificación condicional.
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
Otra opción es declarar una matriz vacía en la parte superior de su función. Esto no siempre es posible.
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(consejo adicional)
- Cuando me encontraba con estos y otros problemas, utilicé NetBeans IDE (gratis) y me dio una gran cantidad de advertencias y avisos. Algunos de ellos ofrecen consejos muy útiles. Esto no es un requisito, y ya no uso IDEs excepto para proyectos grandes. Soy más una
vim
persona en estos días :).