2009-11-25 8 views
5

He estado felizmente utilizando el operador de supresión de errores en mi configuración de desarrollo de PHP. Sin embargo, recientemente se han vuelto golpeado con notificaciones, así:Supresión de error @ No funciona

Notice: Uninitialized string offset: 0 in C:\websites\xxx\htdocs\includes\myscript.php on line 35

Línea 35:

$file_name = @$File['file_name'];

tengo display_errors sobre, y error_reporting establecido en 6143 (E_ALL).

¿Echo de menos algo? ¿No debería suprimirse el error?

Editar:

Probado en escritura virgen:

 
$a = array(); 
$b = @$a['f5']; 

suprimido el error. Así que estoy pensando que estamos cambiando el valor de error_reporting de alguna manera. (Película a 11)

Thx por año de ayuda.

+1

¿Puedes publicar la línea 35? –

+0

Es como si estuvieras suprimiendo una declaración incorrecta. Proporcione el código –

+0

Mostrar todo el código, puede estar en cualquier línea. – Cesar

Respuesta

5

No es un gran fan de la supresión de errores aquí, excepto los scripts desechables o las instancias en las que realmente no hay una buena forma de detectar un error.

Permítanme explicar el comportamiento del error Uninitialized string offset.No es un error:

Ejemplo # 1

$a = 0; 
$b = $a['f5']; 

$a es un valor escalar numérico. En la segunda línea, PHP está emitiendo implícitamente este valor numérico a una cadena. La cadena '0' tiene una longitud de 1.

En PHP puede buscar un carácter en una cadena utilizando un índice de matriz, ya que PHP almacena cadenas como matrices internamente. Por ejemplo:

$s= 'abcd'; 
print_r($s[1]); 

La salida de este código se b, ya que es el segundo carácter de la cadena. En el ejemplo n. ° 1, la búsqueda 'f5' se está convirtiendo en un número ya que las cadenas solo se pueden indexar por posición del carácter. echo intval('f5'); nos muestra qué PHP interpreta la cadena 'f5' como 0 en un contexto numérico.

¿Conmigo hasta ahora? Esto es lo que sucede cuando aplicamos esto al ejemplo # 2

Ejemplo # 2

$a = ''; 
$b = $a['f5']; 

$a es cadena de longitud cero. La segunda línea es la misma que $b= $a[0];, es decir, la segunda línea solicita el primer carácter de una cadena de longitud cero, pero la cadena no contiene caracteres. Así que PHP lanza el siguiente error, que le permite saber el índice, simplemente no existe:

Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

Estos son los golpes duros de la programación en un lenguaje de programación relajado mecanografiado.

+0

Thx para una explicación clara y sucinta, pygorex1. – NotoriousWebmaster

-3

No, el supresor @ evita mostrar advertencias de las llamadas a funciones, no el acceso variable y las declaraciones. El Notice le indica que está accediendo a un elemento de cadena [0] que no está definido, por lo tanto no se inicializó. Si desea suprimir estos, intente verificar todas las variables sin inicializar y asígneles un valor, ya que puede hacerlo con C.

+2

El manual no está de acuerdo con usted, Derek: http://ca.php.net/manual/en/language.operators.errorcontrol.php – NotoriousWebmaster

1

Dado que el error implica un desplazamiento de cadena de 0, no debe aplicarse a la línea de código proporcionado. No hay un desplazamiento entero; estás usando la cadena 'file_name' allí.

Además, utilizar '@' es una idea realmente terrible. Las funciones pueden fallar, lo que hace que el script salga sin ninguna indicación de dónde o por qué. Una mejor manera de manejar la línea de código que ha pegado es la siguiente:

if (isset($File['file_name'])) { 
    $file_name = $File['file_name']; 
} else { 
    // throw exception, return FALSE, print an error and exit, whatever 
} 
+0

Normalmente utilizaría ($ isset ($ File [' file_name '])? $ File [' file_name ']:' '). Pero tendré que estar en desacuerdo con usted sobre el problema del índice: parece ser un error en la versión de PHP que estoy usando (5.2.2). Ver la respuesta que puse. – NotoriousWebmaster

+0

Bizarro. Gracias por el aviso. –

0

OK, aquí está la cosa: PHP no trata bien con los subíndices de matriz no vars. Por ejemplo:

 
$a = 0; 
$b = $a['f5']; 

No genera un error.

Considerando lo siguiente:

 
$a = ''; 
$b = $a['f5']; 

genera este error:

 
Notice: Uninitialized string offset: 0 in C:\websites\tcv3\wc2009\htdocs\aatest_array.php on line 3 

Y ese es el problema que tenía. Si lo cambio para inicializar $ a con matriz(), la supresión de errores funciona. Además, sin supresión de errores, proporciona el índice adecuado en el error.

Sospecho que esto es un error en PHP 5.2.2. ¿Alguien puede probar esto en una versión más actualizada?

Gracias por su ayuda chicos.

+0

Cuando dices "un error en PHP" ... estás hablando de que el primer bit del código no genera un error, ¿no? El error que obtiene del otro código es perfectamente válido. – DisgruntledGoat

Cuestiones relacionadas