ทำไมถึงเกิดขึ้น?
เมื่อเวลาผ่านไป PHP ได้กลายเป็นภาษาที่เน้นความปลอดภัยมากขึ้น การตั้งค่าที่เคยถูกปิดโดยปริยายจะถูกเปิดใช้งานตามค่าเริ่มต้น ตัวอย่างที่สมบูรณ์แบบนี้อยู่E_STRICT
ซึ่งกลายเป็นที่เปิดโดยเริ่มต้น ณPHP 5.4.0
นอกจากนี้ตามค่าเริ่มต้นเอกสาร PHP E_NOTICE
จะถูกปิดการใช้งานใน php.ini เอกสาร PHP ขอแนะนำให้เปลี่ยนมันสำหรับแก้จุดบกพร่องเพื่อ อย่างไรก็ตามเมื่อฉันดาวน์โหลด PHP จากที่เก็บ Ubuntu และจาก Windows ของ BitNami - ฉันเห็นอย่างอื่น
; Common Values:
; E_ALL (Show all errors, warnings and notices including coding standards.)
; E_ALL & ~E_NOTICE (Show all errors, except for notices)
; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.)
; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
ขอให้สังเกตว่าerror_reporting
มีการตั้งค่าตามจริงเป็นค่าเริ่มต้นไม่ใช่ค่า "เริ่มต้น" เป็นค่าเริ่มต้น สิ่งนี้ค่อนข้างสับสนและไม่มีการบันทึกภายนอก php.ini ดังนั้นฉันจึงไม่ได้ตรวจสอบความถูกต้องนี้ในการแจกแจงอื่น
อย่างไรก็ตามหากต้องการตอบคำถามของคุณข้อผิดพลาดนี้จะปรากฏขึ้นทันทีเมื่อไม่ปรากฏขึ้นมาก่อนเนื่องจาก:
คุณติดตั้ง PHP และตั้งค่าเริ่มต้นใหม่จะค่อนข้างเอกสารไม่ดี E_NOTICE
แต่ไม่ได้ยกเว้น
E_NOTICE
คำเตือนเช่นตัวแปรที่ไม่ได้กำหนดและดัชนีที่ไม่ได้กำหนดจะช่วยทำให้โค้ดของคุณสะอาดและปลอดภัยยิ่งขึ้น ฉันสามารถบอกคุณได้ว่าเมื่อหลายปีก่อนการE_NOTICE
เปิดใช้งานทำให้ฉันบังคับให้ประกาศตัวแปรของฉัน มันทำให้ง่ายขึ้นมากในการเรียนรู้ C, การไม่ประกาศตัวแปรนั้นยิ่งใหญ่กว่าความรำคาญ
ฉันจะทำอะไรเกี่ยวกับมันได้บ้าง?
ปิดE_NOTICE
โดยการคัดลอก "ค่าเริ่มต้น" E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
และแทนที่ด้วยสิ่งที่ uncommented error_reporting =
ขณะนี้หลังจากที่เท่ากับใน รีสตาร์ท Apache หรือ PHP ถ้าใช้ CGI หรือ FPM ตรวจสอบให้แน่ใจว่าคุณกำลังแก้ไข "ขวา" php.ini สิ่งที่ถูกต้องจะเป็น Apache หากคุณใช้ PHP กับ Apache, fpm หรือ php-fpm หากใช้ PHP-FPM, cgi หากใช้ PHP-CGI ฯลฯ นี่ไม่ใช่วิธีที่แนะนำ แต่ถ้าคุณมีรหัสดั้งเดิมที่จะไป จะยากเกินกว่าที่จะแก้ไขจากนั้นอาจเป็นทางออกที่ดีที่สุดของคุณ
ปิดE_NOTICE
ไฟล์หรือระดับโฟลเดอร์ สิ่งนี้อาจจะดีกว่าถ้าคุณมีรหัสดั้งเดิม แต่ต้องการทำในสิ่งที่ "ถูกต้อง" เป็นอย่างอื่น ในการทำเช่นนี้คุณควรศึกษา Apache2, Nginx หรือเซิร์ฟเวอร์ที่คุณเลือก ใน Apache คุณจะใช้ภายในphp_value
<Directory>
เขียนโค้ดของคุณใหม่ให้สะอาดขึ้น หากคุณต้องทำสิ่งนี้ขณะที่ย้ายไปยังสภาพแวดล้อมการผลิตหรือไม่ต้องการให้ใครเห็นข้อผิดพลาดของคุณตรวจสอบให้แน่ใจว่าคุณกำลังปิดการแสดงข้อผิดพลาดและบันทึกเฉพาะข้อผิดพลาดของคุณเท่านั้น(ดูdisplay_errors
และlog_errors
ใน php.ini และการตั้งค่าเซิร์ฟเวอร์ของคุณ) .
หากต้องการขยายตัวเลือก 3: นี่คืออุดมคติ หากคุณสามารถไปเส้นทางนี้คุณควร หากคุณไม่ได้ไปเส้นทางนี้ในตอนแรกให้พิจารณาย้ายเส้นทางนี้ในที่สุดโดยการทดสอบรหัสของคุณในสภาพแวดล้อมการพัฒนา ในขณะที่คุณอยู่ที่นั่นกำจัด~E_STRICT
และ~E_DEPRECATED
เพื่อดูสิ่งที่อาจผิดไปในอนาคต คุณจะเห็นข้อผิดพลาดที่ไม่คุ้นเคยมากมาย แต่มันจะหยุดคุณจากปัญหาที่ไม่พึงประสงค์เมื่อคุณต้องการอัพเกรด PHP ในอนาคต
ข้อผิดพลาดหมายถึงอะไร
Undefined variable: my_variable_name
- สิ่งนี้เกิดขึ้นเมื่อตัวแปรไม่ได้ถูกกำหนดก่อนการใช้งาน เมื่อเรียกใช้งานสคริปต์ PHP สคริปต์จะดำเนินการภายในค่าที่เป็นศูนย์เท่านั้น อย่างไรก็ตามในสถานการณ์ใดที่คุณต้องตรวจสอบตัวแปรก่อนที่จะถูกกำหนด? ในที่สุดนี่คืออาร์กิวเมนต์สำหรับ "รหัสเลอะเทอะ" ในฐานะนักพัฒนาซอฟต์แวร์ฉันสามารถบอกคุณได้ว่าฉันรักมันเมื่อฉันเห็นโครงการโอเพนซอร์ซที่มีการกำหนดตัวแปรให้สูงขึ้นในขอบเขตที่พวกเขาสามารถกำหนดได้ มันทำให้ง่ายต่อการบอกตัวแปรที่จะปรากฏขึ้นในอนาคตและทำให้ง่ายต่อการอ่าน / เรียนรู้รหัส
function foo()
{
$my_variable_name = '';
//....
if ($my_variable_name) {
// perform some logic
}
}
Undefined index: my_index
- สิ่งนี้เกิดขึ้นเมื่อคุณพยายามเข้าถึงค่าในอาร์เรย์และไม่มีอยู่ เพื่อป้องกันข้อผิดพลาดนี้ให้ทำการตรวจสอบตามเงื่อนไข
// verbose way - generally better
if (isset($my_array['my_index'])) {
echo "My index value is: " . $my_array['my_index'];
}
// non-verbose ternary example - I use this sometimes for small rules.
$my_index_val = isset($my_array['my_index'])?$my_array['my_index']:'(undefined)';
echo "My index value is: " . $my_index_val;
ตัวเลือกอื่นคือการประกาศอาร์เรย์ว่างที่ด้านบนของฟังก์ชั่นของคุณ มันเป็นไปไม่ได้เสมอไป
$my_array = array(
'my_index' => ''
);
//...
$my_array['my_index'] = 'new string';
(เคล็ดลับเพิ่มเติม)
- เมื่อฉันพบปัญหาเหล่านี้และปัญหาอื่น ๆ ฉันใช้NetBeans IDE (ฟรี) และทำให้ฉันมีโฮสต์ของคำเตือนและประกาศ บางคนมีเคล็ดลับที่เป็นประโยชน์มาก นี่ไม่ใช่ข้อกำหนดและฉันไม่ได้ใช้ IDE อีกต่อไปยกเว้นโครงการขนาดใหญ่
vim
วันนี้ฉันเป็นคนมากขึ้น:)