สำหรับผู้ที่สนใจฉันได้ขยายหัวข้อนี้เป็นบทความเล็ก ๆ ซึ่งให้ข้อมูลด้านล่างในรูปแบบที่ค่อนข้างดีกว่า: คำแนะนำขั้นสุดท้ายสำหรับการตั้งค่าและว่างเปล่าของ PHP
IMHO คุณควรคิดว่าไม่ใช่แค่การสร้างแอป "E_NOTICE เข้ากันได้" แต่เป็นการปรับโครงสร้างทั้งหมด มีหลายร้อยคะแนนในโค้ดของคุณที่พยายามใช้ตัวแปรที่ไม่มีอยู่จริงเป็นประจำดูเหมือนเป็นโปรแกรมที่มีโครงสร้างไม่ดี การพยายามเข้าถึงตัวแปรที่ไม่มีอยู่จริงไม่ควรเกิดขึ้นภาษาอื่นหยุดชะงักในเวลาคอมไพล์ การที่ PHP อนุญาตให้คุณทำมันไม่ได้หมายความว่าคุณควร
คำเตือนเหล่านี้มีไว้เพื่อช่วยคุณไม่ให้คุณรำคาญ หากคุณได้รับคำเตือน"คุณกำลังพยายามทำงานกับสิ่งที่ไม่มีอยู่จริง!" ปฏิกิริยาของคุณควรเป็น"อ๊ะฉันไม่ดีให้ฉันแก้ไขโดยเร็วที่สุด" คุณจะบอกความแตกต่างระหว่าง"ตัวแปรที่ทำงานได้ดีโดยไม่ได้กำหนด"กับรหัสที่ไม่ถูกต้องตรงไปตรงมาซึ่งอาจนำไปสู่ข้อผิดพลาดร้ายแรงได้อย่างไร นี่คือเหตุผลว่าทำไมคุณถึงออกเสมอ การปิดการรายงานข้อผิดพลาดมีไว้สำหรับสภาพแวดล้อมการใช้งานจริงเท่านั้นเพื่อหลีกเลี่ยงการรั่วไหลของข้อมูลและมอบประสบการณ์การใช้งานที่ดียิ่งขึ้นให้กับผู้ใช้แม้จะเผชิญกับรหัสบั๊กเสมอพัฒนากับรายงานข้อผิดพลาดหันไป 11และให้เสียบไปที่รหัสของคุณจนกว่าจะไม่ได้เป็นคนเดียวNOTICE
ทำอย่างละเอียด:
คุณมักจะต้องการisset
หรือempty
อยู่ที่ไหนสักแห่งในโค้ดของคุณวิธีเดียวที่จะลดการเกิดขึ้นคือการเริ่มต้นตัวแปรของคุณอย่างเหมาะสม ขึ้นอยู่กับสถานการณ์มีหลายวิธีในการทำเช่นนั้น:
อาร์กิวเมนต์ของฟังก์ชัน:
function foo ($bar, $baz = null) { ... }
ไม่จำเป็นต้องมีการตรวจสอบว่าเป็น$bar
หรือ$baz
มีการตั้งค่าฟังก์ชั่นภายในเพราะคุณเพียงแค่ตั้งพวกเขาทั้งหมดที่คุณต้องกังวลเกี่ยวกับคือถ้าประเมินค่าของพวกเขาไปtrue
หรือfalse
(หรือสิ่งอื่น)
ตัวแปรปกติทุกที่:
$foo = null;
$bar = $baz = 'default value';
เริ่มต้นตัวแปรของคุณที่ด้านบนสุดของบล็อกโค้ดที่คุณจะใช้ สิ่งนี้จะช่วยแก้ปัญหา!isset
ปัญหาทำให้แน่ใจว่าตัวแปรของคุณมีค่าดีฟอลต์ที่ทราบอยู่เสมอช่วยให้ผู้อ่านทราบว่าโค้ดต่อไปนี้จะทำงานอย่างไรและยังทำหน้าที่เป็นเอกสารประกอบในตัวเองอีกด้วย
อาร์เรย์:
$defaults = array('foo' => false, 'bar' => true, 'baz' => 'default value');
$values = array_merge($defaults, $incoming_array);
เช่นเดียวกับข้างต้นคุณกำลังเริ่มต้นอาร์เรย์ด้วยค่าเริ่มต้นและเขียนทับด้วยค่าจริง
ในกรณีที่เหลือสมมติว่าแม่แบบที่คุณส่งออกค่าที่ตัวควบคุมอาจกำหนดหรือไม่ก็ได้คุณจะต้องตรวจสอบ:
<table>
<?php if (!empty($foo) && is_array($foo)) : ?>
<?php foreach ($foo as $bar) : ?>
<tr>...</tr>
<?php endforeach; ?>
<?php else : ?>
<tr><td>No Foo!</td></tr>
<?php endif; ?>
</table>
หากคุณพบว่าตัวเองใช้งานเป็นประจำarray_key_exists
คุณควรประเมินว่าคุณใช้มันเพื่ออะไร ครั้งเดียวที่สร้างความแตกต่างอยู่ที่นี่:
$array = array('key' => null);
isset($array['key']);
array_key_exists('key', $array);
ตามที่ระบุไว้ข้างต้นแม้ว่าคุณจะเริ่มต้นตัวแปรของคุณอย่างถูกต้องคุณไม่จำเป็นต้องตรวจสอบว่ามีคีย์อยู่หรือไม่เพราะคุณรู้ดี หากคุณได้รับอาร์เรย์จากแหล่งภายนอกค่าส่วนใหญ่จะไม่เป็นnull
แต่''
, 0
, '0'
, false
หรือสิ่งที่ชอบคือค่าคุณสามารถประเมินด้วยisset
หรือempty
ขึ้นอยู่กับเจตนาของคุณ หากคุณตั้งค่าคีย์อาร์เรย์เป็นประจำnull
และต้องการให้มันมีความหมายอะไร แต่false
เช่นถ้าในตัวอย่างข้างต้นผลลัพธ์ที่แตกต่างกันisset
และarray_key_exists
สร้างความแตกต่างให้กับตรรกะโปรแกรมของคุณคุณควรถามตัวเองว่าทำไม การมีอยู่ของตัวแปรไม่ควรมีความสำคัญเพียง แต่ค่าของมันเท่านั้นที่ควรเป็นผล หากคีย์เป็นtrue
/ false
แฟล็กให้ใช้true
หรือไม่false
null
ข้อยกเว้นเพียงอย่างเดียวสำหรับสิ่งนี้คือไลบรารีของบุคคลที่สามที่ต้องการnull
หมายถึงบางสิ่ง แต่เนื่องจากnull
การตรวจพบใน PHP นั้นยากมากฉันจึงยังไม่พบไลบรารีใด ๆ ที่ทำเช่นนี้