การเขียนโปรแกรมเชิงวัตถุได้รับการออกแบบมาเพื่อมอบโซลูชั่นสำหรับโครงการซอฟต์แวร์ขนาดใหญ่ โดยเฉพาะโครงการที่เกี่ยวข้องกับคนหลายคน เมื่อซอร์สโค้ดเพิ่มขึ้นเป็น 10,000 บรรทัดขึ้นไป การเปลี่ยนแปลงทุกครั้งอาจทำให้เกิดผลข้างเคียงที่ไม่พึงประสงค์ สิ่งนี้จะเกิดขึ้นเมื่อโมดูลสร้างพันธมิตรลับ เช่น ใน ยุโรปก่อนสงครามโลกครั้งที่ 1
//haohappy หมายเหตุ: หมายความว่าความสัมพันธ์ระหว่างโมดูลสูงเกินไปและการพึ่งพาซึ่งกันและกันสูงเกินไป การเปลี่ยนโมดูลหนึ่งจะทำให้โมดูลอื่น ๆ เปลี่ยนแปลงตามไปด้วย
ลองนึกภาพถ้าโมดูลที่จัดการการเข้าสู่ระบบอนุญาตให้โมดูลประมวลผลบัตรเครดิตแบ่งปันการเชื่อมต่อฐานข้อมูลได้ แน่นอนว่ามีความตั้งใจที่ดี ซึ่งจะช่วยประหยัดค่าใช้จ่ายในการเชื่อมต่อฐานข้อมูลอื่น อย่างไรก็ตาม บางครั้งโมดูลประมวลผลการเข้าสู่ระบบจะเปลี่ยนการเชื่อมต่อฐานข้อมูลอย่างใดอย่างหนึ่ง ชื่อของตัวแปรอาจตัดข้อตกลงระหว่างทั้งสอง ทำให้เกิดข้อผิดพลาดในการประมวลผลโมดูลบัตรเครดิต ซึ่งจะนำไปสู่ข้อผิดพลาดในโมดูลที่ประมวลผลใบแจ้งหนี้ ในไม่ช้า โมดูลที่ไม่เกี่ยวข้องทั้งหมดในระบบอาจทำให้เกิดข้อผิดพลาด ด้วยเหตุนี้
ฉันรู้สึกซาบซึ้งเล็กน้อยที่โปรแกรมเมอร์ส่วนใหญ่รู้สึกขอบคุณสำหรับการมีเพศสัมพันธ์และการห่อหุ้มเป็นการวัดระดับการพึ่งพาระหว่างสองโมดูล ยิ่งเราต้องการที่จะนำโมดูลออกมา ของโครงการที่มีอยู่แล้วนำไปใช้ในโครงการใหม่ นอกจากนี้
เรายังหวังว่าจะทำการเปลี่ยนแปลงขนาดใหญ่ภายในโมดูลบางอย่างโดยไม่ต้องกังวลกับผลกระทบต่อโมดูลอื่น ๆ หลักการของการห่อหุ้มสามารถให้โซลูชันนี้ได้ ค่อนข้างเป็นอิสระและการสื่อสารข้อมูลระหว่างโมดูล ทำผ่านอินเทอร์เฟซ โมดูลไม่สอดแนมชื่อตัวแปรของกันและกัน พวกเขาส่งคำขออย่างสุภาพผ่านฟังก์ชัน
Encapsulation เป็นหลักการที่คุณสามารถใช้ในภาษาการเขียนโปรแกรมใดก็ได้ ภาษา ไม่มีอะไรหยุดคุณจากการสร้างเว็บสมมุติผ่านโมดูล การเขียนโปรแกรมเชิงวัตถุเป็นหนทางสำหรับโปรแกรมเมอร์ที่จะไม่ละเมิดหลักการของการห่อ
หุ้ม มีวิธีการและคุณสมบัติ จากมุมมองเชิงนามธรรม วิธีการคือการกระทำของวัตถุ และคุณสมบัติคือคุณลักษณะของวัตถุ ในมุมมองการเขียนโปรแกรม วิธีการคือฟังก์ชันและคุณสมบัติเป็นตัวแปรในวัตถุในอุดมคติ ระบบเชิงแต่ละส่วนเป็นวัตถุ ระบบประกอบด้วยวัตถุและความสัมพันธ์ระหว่างวัตถุผ่านวิธีการ
คลาสจะกำหนดคุณสมบัติของวัตถุ หากคุณกำลังอบชุดของวัตถุคุกกี้ คลาสนั้นจะเป็นเครื่องคุกกี้ คุณสมบัติและวิธีการของคลาสเรียกว่าสมาชิก เราสามารถแสดงสิ่งนี้ได้โดยบอกว่าสมาชิกข้อมูลหรือสมาชิกเมธอด
แต่ละภาษามีวิธีการเข้าถึงออบเจ็กต์ที่แตกต่างกัน ตัวระบุ เมื่อ PHP ได้รับการออกแบบครั้งแรก และแม้กระทั่งเมื่อ PHP3 ได้รับการพัฒนา PHP ก็ไม่ได้ตั้งใจที่จะให้ความสามารถในการพัฒนาโครงการขนาดใหญ่ที่มีโค้ดเกิน 100,000 บรรทัด ด้วยการพัฒนากลไก PHP และ Zend ทำให้สามารถพัฒนาโปรเจ็กต์ขนาดใหญ่ได้ แต่ไม่ว่าโปรเจ็กต์ของคุณจะใหญ่แค่ไหน การเขียนสคริปต์ในคลาสจะทำให้โค้ดสามารถนำกลับมาใช้ใหม่ได้ นี่เป็นความคิดที่ดี โดยเฉพาะอย่างยิ่งหากคุณยินดีที่จะแบ่งปันรหัสของคุณกับผู้อื่น
แนวคิดเรื่องวัตถุเป็นหนึ่งในแนวคิดที่น่าตื่นเต้นที่สุดในวิทยาการคอมพิวเตอร์ มันยากที่จะเชี่ยวชาญในตอนแรก แต่ฉันรับประกันได้ว่าเมื่อคุณเชี่ยวชาญแล้ว การคิดด้วยจิตใจจะรู้สึกเป็นธรรมชาติมาก
โมเดลออบเจ็กต์ของ PHP5
PHP5 มีการสืบทอดเพียงครั้งเดียว การเข้าถึงแบบจำกัด และโมเดลออบเจ็กต์ที่โอเวอร์โหลดได้ ซึ่งจะกล่าวถึงในรายละเอียดในบทนี้ รวมถึงความสัมพันธ์ระหว่างพ่อแม่และลูกระหว่างคลาส นอกจากนี้ PHP ยังรองรับคุณลักษณะและการเข้าถึงแบบจำกัด วิธีการต่างๆ คุณสามารถประกาศให้สมาชิกเป็นแบบส่วนตัวและไม่อนุญาตให้เข้าถึงจากคลาสภายนอกได้ ในที่สุด PHP ก็อนุญาตให้คลาสย่อยโอเวอร์โหลดสมาชิกจากคลาสพาเรนต์
ได้ เพื่อส่งผ่านและส่งคืนออบเจ็กต์อย่างชัดเจนโดยการอ้างอิง เราจะอธิบายรายละเอียดเกี่ยวกับโมเดลออบเจ็กต์ที่ส่วนท้ายของบท
นี้ การใช้หน่วยความจำน้อยลงและมีความยืดหยุ่นมากขึ้น
ใน PHP เวอร์ชันก่อนหน้า สคริปต์จะคัดลอกออบเจ็กต์ตามค่าเริ่มต้น ขณะนี้ PHP5 ย้ายเฉพาะตัวจัดการ ซึ่งต้องใช้เวลาน้อยลง การปรับปรุงประสิทธิภาพการดำเนินการสคริปต์เกิดจากการหลีกเลี่ยงการคัดลอกที่ไม่จำเป็น นำมาซึ่งความซับซ้อนและยังนำมาซึ่งประโยชน์ในด้านประสิทธิภาพในการดำเนินการ ขณะเดียวกัน การลดการคัดลอกหมายความว่ามีหน่วยความจำน้อยลงซึ่งสามารถจองได้ ทำให้มีหน่วยความจำว่างมากขึ้นสำหรับการดำเนินการอื่น ๆ ซึ่งช่วยเพิ่มประสิทธิภาพด้วย
Zand Engine 2 มีความยืดหยุ่นมากขึ้น การพัฒนาที่ดีคือการอนุญาตให้ดำเนินการทำลายล้างเมธอดคลาสก่อนที่อ็อบเจ็กต์จะถูกทำลาย ซึ่งยังเป็นประโยชน์อย่างมากสำหรับการใช้หน่วยความจำ ทำให้ PHP รู้อย่างชัดเจนเมื่อไม่มีการอ้างอิงถึงอ็อบเจ็กต์ และจัดสรรหน่วยความจำที่ว่าง เพื่อการใช้งานอื่น ๆ
การถ่ายโอนอ็อบเจ็กต์
การจัดการหน่วยความจำของ PHP5
PHP5 ใช้ Zend Engine II และอ็อบเจ็กต์จะถูกเก็บไว้ใน Object Store ที่มีโครงสร้างแยกต่างหาก มันไม่ได้ถูกเก็บไว้ใน Zval เช่นเดียวกับตัวแปรทั่วไปอื่น ๆ (ใน PHP4 อ็อบเจ็กต์จะถูกเก็บไว้ใน Zval เช่นเดียวกับตัวแปรทั่วไป ). เฉพาะตัวชี้ของวัตถุเท่านั้นที่ถูกเก็บไว้ใน Zval แทนที่จะเป็นเนื้อหา (ค่า) เมื่อเราคัดลอกวัตถุหรือส่งวัตถุเป็นพารามิเตอร์ไปยังฟังก์ชัน เราไม่จำเป็นต้องคัดลอกข้อมูล เพียงเก็บตัวชี้วัตถุเดิมไว้และแจ้ง Object Store ว่าขณะนี้วัตถุนี้ชี้ไปผ่าน zval อื่น เนื่องจากวัตถุนั้นอยู่ใน Object Store การเปลี่ยนแปลงใด ๆ ที่เราทำกับมันจะส่งผลต่อโครงสร้าง zval ทั้งหมดที่ถือตัวชี้ไปยังวัตถุ - แสดงในโปรแกรมเนื่องจากการเปลี่ยนแปลงใด ๆ กับวัตถุเป้าหมายจะส่งผลต่อวัตถุต้นทาง . สิ่งนี้ทำให้ออบเจ็กต์ PHP ดูเหมือนว่าจะถูกส่งผ่านโดยการอ้างอิงเสมอ ดังนั้นออบเจ็กต์ใน PHP จะถูกส่งผ่านโดย "การอ้างอิง" ตามค่าเริ่มต้น และคุณไม่จำเป็นต้องใช้ & เพื่อประกาศเหมือนใน PHP4 อีกต่อไป
กลไกการรวบรวมขยะ
ในบางภาษา โดยทั่วไปเป็นภาษา C กำหนดให้คุณต้องขอการจัดสรรหน่วยความจำอย่างชัดเจนเมื่อคุณสร้างโครงสร้างข้อมูล เมื่อคุณจัดสรรหน่วยความจำแล้ว คุณสามารถจัดเก็บข้อมูลเป็นตัวแปรได้ ในเวลาเดียวกัน คุณยังต้องปล่อยหน่วยความจำเมื่อคุณใช้ตัวแปรเสร็จแล้ว เพื่อให้เครื่องสามารถเพิ่มหน่วยความจำสำหรับตัวแปรอื่นๆ และหลีกเลี่ยงหน่วยความจำไม่เพียงพอ
PHP สามารถจัดการหน่วยความจำและล้างวัตถุที่ไม่จำเป็นอีกต่อไปได้โดยอัตโนมัติ PHP ใช้กลไกการรวบรวมขยะอย่างง่ายที่เรียกว่าการนับการอ้างอิง แต่ละวัตถุมีตัวนับอ้างอิง และการอ้างอิงแต่ละรายการที่เชื่อมต่อกับวัตถุจะเพิ่มตัวนับทีละหนึ่ง เมื่อการอ้างอิงออกจากพื้นที่อยู่อาศัยหรือตั้งค่าเป็น NULL ตัวนับจะลดลง 1 เมื่อตัวนับอ้างอิงของวัตถุถึงศูนย์ PHP จะรู้ว่าคุณไม่จำเป็นต้องใช้วัตถุนั้นอีกต่อไป และจะปล่อยพื้นที่หน่วยความจำที่วัตถุนั้นครอบครอง
ตัวอย่างเช่น:
<?php
บุคคลในชั้นเรียน{}
ฟังก์ชั่น sendEmailTo(){}
$haohappy = คนใหม่( );
// สร้างวัตถุใหม่: จำนวนอ้างอิง จำนวนอ้างอิง = 1
$haohappy2 = $haohappy;
// คัดลอกโดยการอ้างอิง: จำนวนอ้างอิง = 2
ไม่ได้ตั้งค่า($haohappy);
// ลบข้อมูลอ้างอิง: จำนวนอ้างอิง = 1
sendEmailTo($haohappy2);
// ส่งผ่านวัตถุโดยการอ้างอิง:
// ระหว่างการเรียกใช้ฟังก์ชัน:
// จำนวนอ้างอิง = 2
//หลังดำเนินการ:
// จำนวนอ้างอิง = 1
ไม่ได้ตั้งค่า ($haohappy2);
// ลบการอ้างอิง: จำนวนการอ้างอิง = 0 ปล่อยพื้นที่หน่วยความจำโดยอัตโนมัติ
?>