พิจารณาโค้ดต่อไปนี้ซึ่งตัวตั้งค่าใช้งานไม่ได้เนื่องจากเจตนาผิดพลาดในการตั้งโปรแกรมแบบธรรมดาที่ฉันเคยทำมาแล้วสองสามครั้งในอดีต:
<?php
class TestClass {
private $testField;
function setField($newVal) {
$testField = $newVal;
// deliberately broken; should be `$this->testField = $newVal`
}
function getField() {
return $this->testField;
}
}
$testInstance = new TestClass();
$testInstance->setField("Hello world!");
// Actually prints nothing; getField() returns null
echo $testInstance->getField();
?>
ความจริงที่ฉันประกาศ$testField
ที่ด้านบนของชั้นเรียนช่วยปกปิดข้อผิดพลาดในการเขียนโปรแกรมจากฉัน หากฉันไม่ได้ประกาศเขตข้อมูลฉันจะได้รับข้อความคล้ายกับคำเตือนต่อไปนี้ที่พิมพ์ลงในบันทึกข้อผิดพลาดของฉันเมื่อเรียกสคริปต์นี้ซึ่งอาจเป็นประโยชน์ในการช่วยแก้ไขข้อบกพร่องของฉัน - โดยเฉพาะอย่างยิ่งถ้าฉันทำข้อผิดพลาดเช่นนี้ แอปพลิเคชันในโลกแห่งความจริงที่มีขนาดใหญ่และซับซ้อน:
ประกาศ PHP: คุณสมบัติที่ไม่ได้กำหนด: TestClass :: $ testField ใน /var/www/test.php ที่บรรทัดที่ 13
ด้วยการประกาศไม่มีคำเตือน
บางทีฉันหายไปบางอย่าง แต่ฉันรู้เพียงสองเหตุผลที่จะประกาศฟิลด์คลาสใน PHP: ประการแรกการประกาศทำหน้าที่เป็นเอกสารประกอบและประการที่สองโดยไม่มีการประกาศเราไม่สามารถใช้private
และprotected
ตัวดัดแปลงการเข้าถึงซึ่งเป็น มีประโยชน์เนื้อหา เนื่องจากอาร์กิวเมนต์หลังไม่ได้ใช้กับเขตข้อมูลสาธารณะ - การกำหนดให้กับเขตข้อมูลที่ไม่ได้ประกาศของวัตถุทำให้เป็นสาธารณะ - ฉันคิดว่าอย่างน้อยฉันควรจะแสดงความคิดเห็นเกี่ยวกับการประกาศเขตข้อมูลสาธารณะทั้งหมดของฉัน ความคิดเห็นจะให้ค่าเอกสารที่แน่นอนเหมือนกัน แต่ฉันจะได้รับประโยชน์จากคำเตือนหากฉันพยายามอ่านฟิลด์ที่ไม่มีการกำหนดค่าเริ่มต้น
อย่างไรก็ตามเมื่อพิจารณาเพิ่มเติมแล้วดูเหมือนว่ามันไม่สมเหตุสมผลเลยที่จะหยุดอยู่แค่นั้น เนื่องจากในประสบการณ์ของฉันพยายามอ่านฟิลด์ uninitialized เป็นสาเหตุของข้อผิดพลาดทั่วไปมากกว่าพยายามอ่านหรือปรับเปลี่ยนฟิลด์ส่วนตัวหรือป้องกันอย่างไม่เหมาะสม (ฉันเคยทำมาหลายครั้งแล้วในอาชีพการเขียนโปรแกรมระยะสั้นของฉัน แต่ไม่เคยหลัง ) ดูเหมือนว่าฉันชอบที่จะแสดงความคิดเห็นการประกาศภาคสนามทั้งหมด - ไม่ใช่แค่การเปิดเผยต่อสาธารณะ - เป็นการปฏิบัติที่ดี
สิ่งที่ทำให้ฉันลังเลคือฉันไม่เคยเห็นใครทำในรหัส ทำไมจะไม่ล่ะ? มีประโยชน์ในการประกาศฟิลด์คลาสที่ฉันไม่ทราบหรือไม่? หรือฉันสามารถแก้ไขการกำหนดค่าของ PHP ในบางวิธีเพื่อเปลี่ยนพฤติกรรมของการประกาศฟิลด์เพื่อให้ฉันสามารถใช้การประกาศฟิลด์จริงและยังคงได้รับประโยชน์จากคำเตือน "คุณสมบัติที่ไม่ได้กำหนด"? หรือมีอะไรอีกที่ฉันไม่ได้รับในการวิเคราะห์ของฉัน?
TRUE === $variable
เพื่อป้องกันตัวเองจากการมอบหมายโดยไม่ได้ตั้งใจแทนที่จะเปรียบเทียบ