PHP 버전을 5.4.0-3으로 업데이트 한 후 이상한 PHP 오류가 발생합니다.
이 배열이 있습니다.
Array
(
[host] => 127.0.0.1
[port] => 11211
)
이와 같이 액세스하려고하면 이상한 경고가 나타납니다.
print $memcachedConfig['host'];
print $memcachedConfig['port'];
Warning: Illegal string offset 'host' in ....
Warning: Illegal string offset 'port' in ...
php.ini를 편집하고 오류 수준을 다시 설정하고 싶지 않습니다.
답변
이 방법으로 시도하십시오 ….이 코드를 테스트했습니다 …. 작동합니다 ….
$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
답변
오류는 Illegal string offset 'whatever' in...
일반적으로 문자열을 전체 배열로 사용하려고한다는 것을 의미합니다.
실제로 문자열은 PHP에서 단일 문자의 배열로 취급 될 수 있기 때문에 가능합니다. 따라서 $ var은 키가있는 배열이지만 표준 숫자 키가 있는 문자열 일뿐입니다 .
$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
http://ideone.com/fMhmkR 에서 실제로 볼 수 있습니다
이 질문에 온 사람들은 내가 그랬던 것처럼 오류의 모호함을 그것에 대해 할 수있는 것으로 바꾸려고합니다.
답변
TL; DR
string
a 키가있는 배열 인 것처럼 a에 액세스하려고 합니다 string
. string
이해하지 못할 것입니다. 코드에서 우리는 문제를 볼 수 있습니다 :
"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.
깊이
그 오류를 보자.
경고 : 잘못된 문자열 오프셋 ‘port’…
그것은 무엇을 말하는가? 문자열을 문자열 'port'
의 오프셋으로 사용하려고 합니다. 이처럼 :
$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 ...
무엇이 원인입니까?
어떤 이유로 당신은을 기대 array
했지만 string
. 그냥 섞어. 아마도 변수가 변경되었을 수도 있고, 결코 변하지 않았을 수도 있습니다 array
. 정말 중요하지 않습니다.
무엇을 할 수 있습니까?
가 있어야한다는 것을 알고 있다면 array
기본 디버깅을 수행하여 왜을 갖지 않는지 결정해야합니다 array
. 우리가있을 것이다 경우에 우리가 알 수없는 경우 array
또는 string
상황이 조금 까다된다.
우리가 할 수있는 일은 온갖 종류의 검사를 통해 우리가 is_array
and 및 isset
/ 와 같은 것에 대한 통지, 경고 또는 오류가 없는지 확인합니다 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
}
isset
와 사이에는 약간의 차이가 array_key_exists
있습니다. 예를 들어의 값 $array['key']
이 null
인 isset
경우을 반환합니다 false
. array_key_exists
키 가 존재 하는지 확인 합니다 .
답변
여기에 많은 훌륭한 답변이 있지만 내 문제가 훨씬 더 간단하다는 것을 알았습니다.
다음 명령을 실행하려고했습니다.
$x['name'] = $j['name'];
나는이지고 있었어요 illegal string
에 오류를 $x['name']
내가 먼저 배열을 정의하지 않았기 때문에. 그래서 물건을 할당하기 전에 다음 코드 줄을 넣었습니다 $x[]
.
$x = array();
그리고 효과가있었습니다.
답변
질문에 조금 늦었지만 검색중인 다른 사람들에게 : 잘못된 값 (유형)으로 초기화 하여이 오류가 발생했습니다.
$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset
올바른 방법은 다음과 같습니다.
$varName = array();
$varName["x"] = "test"; // works
답변
PHP 5.4부터 함수가 기대하는 것과 동일한 데이터 타입 값을 전달해야합니다. 예를 들면 다음과 같습니다.
function testimonial($id); // This function expects $id as an integer
이 함수를 호출 할 때 다음과 같이 문자열 값이 제공되는 경우 :
$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning
데이터 형식이 일치하지 않아 잘못된 오프셋 경고가 생성됩니다. 이를 해결하기 위해 다음을 사용할 수 있습니다 settype
.
$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
답변
배열을 확인하기 전에 다음을 수행하십시오.
if(!is_array($memcachedConfig))
$memcachedConfig = array();