TL; DR
Vous essayez d'accéder à un string
comme s'il s'agissait d'un tableau, avec une clé qui est un string
. string
ne comprendra pas cela. Dans le code, nous pouvons voir le problème:
"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.
En profondeur
Voyons cette erreur:
Avertissement: décalage de chaîne non autorisé 'port' dans ...
Ça dit quoi? Il dit que nous essayons d'utiliser la chaîne 'port'
comme décalage pour une chaîne. Comme ça:
$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'est-ce qui cause cela?
Pour une raison quelconque, vous vous attendiez à un array
, mais vous avez un string
. Juste une confusion. Peut-être que votre variable a été modifiée, peut-être qu'elle n'a jamais été un array
, ce n'est vraiment pas important.
Ce qui peut être fait?
Si nous savons que nous devrions avoir un array
, nous devrions effectuer un débogage de base pour déterminer pourquoi nous n'avons pas de fichier array
. Si nous ne savons pas si nous aurons un array
ou string
, les choses deviennent un peu plus délicates.
Ce que nous pouvons faire, c'est toutes sortes de vérifications pour nous assurer que nous n'avons pas d'avis, d'avertissements ou d'erreurs avec des choses comme is_array
et isset
ou 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
}
Il existe des différences subtiles entre isset
et array_key_exists
. Par exemple, si la valeur de $array['key']
est null
, isset
renvoie false
. array_key_exists
va juste vérifier que, eh bien, la clé existe .
$memcachedConfig
n'est évidemment pas ce tableau. Spectaclevar_dump($memcachedConfig);