TL; DR
Próbujesz uzyskać dostęp do string
tablicy, jakby to była tablica, z kluczem, który jest string
. string
nie zrozumie tego. W kodzie możemy zobaczyć problem:
"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.
Dogłębnie
Zobaczmy ten błąd:
Ostrzeżenie: niedozwolony przesunięcie ciągu „port” w ...
Co to mówi? Mówi, że próbujemy użyć łańcucha 'port'
jako przesunięcia łańcucha. Lubię to:
$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 ...
Co to powoduje?
Z jakiegoś powodu spodziewałeś się array
, ale masz string
. Po prostu pomyłka. Może twoja zmienna została zmieniona, może nigdy nie byłaarray
, to naprawdę nie jest ważne.
Co można zrobić?
Jeśli wiemy, że powinniśmy mieć array
, powinniśmy wykonać podstawowe debugowanie, aby ustalić, dlaczego nie mamy array
. Jeśli nie wiemy, czy będziemy mieli, array
lub string
, sytuacja stanie się nieco trudniejsza.
Co nam może zrobić, to wszelkiego rodzaju kontroli w celu zapewnienia, że nie mamy Zawiadomienia, ostrzeżenia lub błędy z rzeczy, jak is_array
i isset
albo 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
}
Istnieją pewne subtelne różnice między isset
i array_key_exists
. Na przykład, jeśli wartość $array['key']
wynosi null
, isset
zwraca false
. array_key_exists
po prostu sprawdzi, czy klucz istnieje .
$memcachedConfig
nie jest to tablica. Showvar_dump($memcachedConfig);