TL; DR
คุณกำลังพยายามที่จะเข้าถึงราวกับว่ามันเป็นอาร์เรย์ที่มีคีย์ที่เป็นstring
จะไม่เข้าใจว่า ในรหัสเราสามารถเห็นปัญหา: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'
เป็นอ็อฟเซ็ตสำหรับสตริง แบบนี้:
$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
และ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
$memcachedConfig
ไม่ใช่อาร์เรย์นั้น แสดงvar_dump($memcachedConfig);