[php] 잘못된 문자열 오프셋 경고 PHP

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

stringa 키가있는 배열 인 것처럼 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_arrayand 및 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']nullisset경우을 반환합니다 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();