Desplazamiento de cadena ilegal Advertencia PHP

Resuelto thesonix asked hace 54 años • 17 respuestas

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.

thesonix avatar Jan 01 '70 08:01 thesonix
Aceptado

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.

Kzqai avatar Nov 28 '2013 17:11 Kzqai

Estás intentando acceder a stringcomo si fuera una matriz, con una clave que es un archivo string. stringNo 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 arrayo 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_arrayy isseto 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 issety array_key_exists. Por ejemplo, si el valor de $array['key']es null, issetdevuelve false. array_key_existsSimplemente comprobaré que, bueno, la clave existe .

Jon Surrell avatar Feb 19 '2015 15:02 Jon Surrell