Desplazamiento de cadena ilegal Advertencia PHP
Recibo un extraño error de PHP después de actualizar mi versión de PHP a 5.4.0-3.
Tengo esta matriz:
Array
(
[host] => 127.0.0.1
[port] => 11211
)
Cuando intento acceder así, recibo advertencias extrañas.
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ...
Realmente no quiero simplemente editar mi php.ini y restablecer el nivel de error.
El error Illegal string offset 'whatever' in...
generalmente significa: está intentando utilizar una cadena como una matriz completa.
En realidad, esto es posible ya que las cadenas pueden tratarse como matrices de caracteres individuales en php. Entonces estás pensando que $var es una matriz con una clave, pero es solo una cadena con claves numéricas estándar, por ejemplo:
$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error
Puedes ver esto en acción aquí: http://ideone.com/fMhmkR
Para aquellos que llegan a esta pregunta tratando de traducir la vaguedad del error en algo que hacer al respecto, como lo hice yo.
Estás intentando acceder a string
como si fuera una matriz, con una clave que es un archivo string
. string
No entenderé eso. En el código podemos ver el problema:
"hello"["hello"];
// PHP Warning: Illegal string offset 'hello' in php shell code on line 1
"hello"[0];
// No errors.
array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.
A fondo
Veamos ese error:
Advertencia: 'Puerto' de desplazamiento de cadena ilegal en...
¿Qué dice? Dice que estamos intentando usar la cadena 'port'
como desplazamiento para una cadena. Como esto:
$a_string = "string";
// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...
// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...
¿Qué causa esto?
Por alguna razón esperabas un array
, pero tienes un string
. Sólo una confusión. Tal vez su variable fue cambiada, tal vez nunca fue una array
, realmente no es importante.
¿Qué se puede hacer?
Si sabemos que deberíamos tener un archivo array
, debemos hacer una depuración básica para determinar por qué no tenemos un archivo array
. Si no sabemos si tendremos un array
o string
, las cosas se vuelven un poco más complicadas.
Lo que podemos hacer es todo tipo de comprobaciones para asegurarnos de que no tengamos avisos, advertencias o errores con cosas como is_array
y isset
o array_key_exists
:
$a_string = "string";
$an_array = array('port' => 'the_port');
if (is_array($a_string) && isset($a_string['port'])) {
// No problem, we'll never get here.
echo $a_string['port'];
}
if (is_array($an_array) && isset($an_array['port'])) {
// Ok!
echo $an_array['port']; // the_port
}
if (is_array($an_array) && isset($an_array['unset_key'])) {
// No problem again, we won't enter.
echo $an_array['unset_key'];
}
// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
// Ok!
echo $an_array['port']; // the_port
}
Existen algunas diferencias sutiles entre isset
y array_key_exists
. Por ejemplo, si el valor de $array['key']
es null
, isset
devuelve false
. array_key_exists
Simplemente comprobaré que, bueno, la clave existe .