วิธีการเข้าถึงของ PHP5 ช่วยให้สามารถจำกัดการเข้าถึงสมาชิกชั้นเรียนได้ นี่เป็นคุณสมบัติใหม่ใน PHP5 แต่มีมานานแล้วในภาษาเชิงวัตถุหลายภาษา ด้วยวิธีการเข้าถึง คุณสามารถพัฒนาแอปพลิเคชันเชิงอ็อบเจ็กต์ที่เชื่อถือได้ และสร้างไลบรารีคลาสเชิงอ็อบเจ็กต์ที่สามารถนำมาใช้ซ้ำได้
เช่นเดียวกับ C++ และ Java, PHP มีวิธีการเข้าถึงสามวิธี: สาธารณะ, ส่วนตัว และการป้องกัน คุณสามารถระบุวิธีการเข้าถึงแบบใดแบบหนึ่งได้ สมาชิกแบบคงที่ระบุวิธีการเข้าถึง วางวิธีการเข้าถึงก่อนคำหลักแบบคงที่ (เช่น สาธารณะแบบคงที่)
สมาชิกแบบสาธารณะสามารถเข้าถึงได้โดยไม่มีข้อจำกัด รหัสใดๆ นอกชั้นเรียนสามารถอ่านและเขียนคุณสมบัติสาธารณะได้จาก สคริปต์ เรียกวิธีการสาธารณะได้ทุกที่ ใน PHP เวอร์ชันก่อนหน้า วิธีการและคุณสมบัติทั้งหมดเป็นแบบสาธารณะ ซึ่งทำให้อ็อบเจ็กต์ดูเหมือนอาร์เรย์ที่มีโครงสร้างสวยงาม
สมาชิกส่วนตัวจะมองเห็นได้ภายในชั้นเรียนเท่านั้น คุณไม่สามารถเปลี่ยนแปลงหรืออ่านค่าของทรัพย์สินส่วนตัวนอกวิธีการเรียนที่มันอยู่ ในทำนองเดียวกัน เฉพาะเมธอดในคลาสเดียวกันเท่านั้นที่สามารถเรียกเมธอดส่วนตัวได้ และคลาสย่อยที่สืบทอดมาไม่สามารถเข้าถึงสมาชิกส่วนตัวในคลาสพาเรนต์ได้
โปรดทราบว่าสมาชิกส่วนตัวสามารถเข้าถึงได้โดยสมาชิกของชั้นเรียนและอินสแตนซ์ของชั้นเรียน เมื่อดูตัวอย่างที่ 6.8 วิธีการเท่ากับจะเปรียบเทียบสองวิดเจ็ต ตัวดำเนินการ == เปรียบเทียบสองวัตถุที่อยู่ในคลาสเดียวกัน แต่ในตัวอย่างนี้ แต่ละอินสแตนซ์ของวัตถุจะมี ID ที่ไม่ซ้ำกันเท่านั้น สังเกตว่าเมธอดเท่ากับเข้าถึงทรัพย์สินส่วนตัวของอินสแตนซ์ Widget อื่นได้อย่างไร ทั้ง Java และ C อนุญาตสิ่งนี้
รายการ 6.8
วิดเจ็ตคลาส
สมาชิกส่วนตัว
-
ชื่อ $ ส่วนตัว;
ราคา $ ส่วนตัว;
ส่วนตัว $id;
ฟังก์ชั่นสาธารณะ __construct($name, $price)
-
$นี่->ชื่อ = $ชื่อ;
$นี่->ราคา = floatval($ราคา);
$นี่->id = uniqid();
-
//ตรวจสอบว่าวิดเจ็ตสองตัวมีฟังก์ชันสาธารณะเหมือนกันหรือไม่ ($widget)
-
return(($this->name == $widget->name)AND ($this->price == $widget->price));
-
-
$w1 = วิดเจ็ตใหม่ ('ฟันเฟือง', 5.00);
$w2 = วิดเจ็ตใหม่ ('ฟันเฟือง', 5.00);
$w3 = วิดเจ็ตใหม่ ('เกียร์', 7.00);
//TRUE
ถ้า($w1->เท่ากับ($w2))
-
print("w1 และ w2 เหมือนกัน n");
}
//เท็จ
ถ้า($w1->เท่ากับ($w3))
-
print("w1 และ w3 เหมือนกัน n");
}
//FALSE, == รวม id ในการเปรียบเทียบ
if($w1 == $w2) //ไม่เท่ากันเพราะ ID ต่างกัน
-
print("w1 และ w2 เหมือนกัน n");
-
?>
หากคุณยังใหม่กับการเขียนโปรแกรมเชิงวัตถุ คุณอาจสงสัยว่าจุดประสงค์ของการใช้สมาชิกส่วนตัวคืออะไร คุณอาจจำแนวคิดของการห่อหุ้มและการเชื่อมต่อได้ ซึ่งเราได้พูดคุยกันในตอนต้นของบทนี้ สมาชิกส่วนตัวช่วยห่อหุ้มข้อมูล พวกมันสามารถซ่อนอยู่ภายในคลาสไม่ให้เข้าถึงได้ด้วยโค้ดภายนอกคลาส นอกจากนี้ยังช่วยให้เกิดการเชื่อมต่อแบบหลวม ๆ หากโค้ดภายนอกโครงสร้างข้อมูลไม่สามารถเข้าถึงคุณสมบัติภายในได้โดยตรง แสดงว่าไม่มีความสัมพันธ์โดยนัย
แน่นอนว่าคุณสมบัติส่วนตัวส่วนใหญ่ยังคงสามารถแชร์ด้วยรหัสภายนอกได้ วิธีแก้ไขคือการใช้วิธีการสาธารณะสองวิธี วิธีหนึ่งคือรับ (รับมูลค่าของคุณสมบัติ) อีกวิธีหนึ่งถูกตั้งค่า (ตั้งค่าของคุณสมบัติ) ตัวสร้างยังยอมรับค่าเริ่มต้นสำหรับคุณสมบัติ สิ่งนี้ทำให้การสื่อสารระหว่างสมาชิกเกิดขึ้นผ่านอินเทอร์เฟซที่แคบและมีคุณสมบัติเหมาะสม นอกจากนี้ยังให้โอกาสในการเปลี่ยนค่าที่ส่งผ่านไปยังเมธอด ทำให้ราคาเป็นตัวเลขทศนิยม (floadval())
สมาชิกที่ได้รับการป้องกัน (ป้องกัน) สามารถเข้าถึงได้ด้วยวิธีการทั้งหมดในคลาสเดียวกันและวิธีการทั้งหมดในคลาสที่สืบทอดมา คุณสมบัติสาธารณะขัดแย้งกับเจตนารมณ์ของการห่อหุ้มเนื่องจากคลาสย่อยต้องอาศัยคุณสมบัติเฉพาะในการเขียน วิธีการที่ได้รับการป้องกันไม่ได้นำมาซึ่งข้อกังวลนี้ .
ตัวอย่าง 6.9 ได้รับการปรับปรุงจากตัวอย่าง 6.8 และรวมคลาสย่อย Thing ของ Widget โปรดทราบว่าขณะนี้ Widget มีเมธอดที่ได้รับการป้องกันที่เรียกว่า getName หากอินสแตนซ์ของ Widget พยายามเรียกใช้เมธอดที่ได้รับการป้องกัน ข้อผิดพลาดจะเกิดขึ้น: $w1->getName() สร้างข้อผิดพลาด แต่เมธอด getName ในคลาสย่อย Thing สามารถเรียกสิ่งนี้ว่าได้รับการป้องกัน วิธีการ แน่นอนว่า ตัวอย่างนี้ง่ายเกินไปที่จะพิสูจน์ว่าวิธี Widget::getName ได้รับการปกป้อง ในสถานการณ์จริง การใช้วิธีป้องกันขึ้นอยู่กับการทำความเข้าใจโครงสร้างภายในของวัตถุ
รายการ 6.9
วิดเจ็ตคลาส
สมาชิกที่ได้รับการคุ้มครอง
-
ชื่อ $ ส่วนตัว;
ราคา $ ส่วนตัว;
ส่วนตัว $id;
ฟังก์ชั่นสาธารณะ __construct($name, $price)
-
$นี่->ชื่อ = $ชื่อ;
$นี่->ราคา = floatval($ราคา);
$นี่->id = uniqid();
}
//ตรวจสอบว่าวิดเจ็ตสองตัวเหมือนกันหรือไม่
ฟังก์ชั่นสาธารณะเท่ากับ ($widget)
-
return(($this->name == $widget->name)AND($this->price == $widget->price));
}
ฟังก์ชันที่ได้รับการป้องกัน getName()
-
กลับ($นี่->ชื่อ);
-
}
คลาส Thing ขยายวิดเจ็ต
-
ส่วนตัว $color;
ฟังก์ชั่นสาธารณะ setColor($color)
-
$นี่->สี = $สี;
}
ฟังก์ชั่นสาธารณะ getColor()
-
กลับ($นี่->สี);
}
ฟังก์ชั่นสาธารณะ getName()
-
กลับ(พาเรนต์::getName());
-
}
$w1 = วิดเจ็ตใหม่ ('Cog', 5.00);
$w2 = สิ่งใหม่ ('ฟันเฟือง', 5.00);
$w2->setColor('Yellow');
//TRUE (ยัง!) ผลลัพธ์ยังคงเป็นจริง
ถ้า($w1->เท่ากับ($w2))
-
print("w1 และ w2 เหมือนกัน n");
}
//พิมพ์ฟันเฟืองเอาท์พุตฟันเฟือง
พิมพ์($w2->getName());
?>
คลาสย่อยอาจเปลี่ยนวิธีการเข้าถึงเมธอดโดยการแทนที่เมธอดคลาสพาเรนต์ อย่างไรก็ตาม ยังมีข้อจำกัดบางประการ หากคุณแทนที่สมาชิกคลาสสาธารณะ จะต้องคงสถานะสาธารณะในคลาสย่อยของมัน หากคุณแทนที่สมาชิกที่ได้รับการป้องกัน สมาชิกนั้นจะยังคงได้รับการคุ้มครองหรือกลายเป็นสาธารณะเท่านั้น การประกาศสมาชิกด้วยชื่อเดียวกับสมาชิกส่วนตัวของคลาสหลักจะสร้างสมาชิกรายอื่นในคลาสปัจจุบัน ดังนั้น ในทางเทคนิคแล้ว คุณไม่สามารถแทนที่สมาชิกส่วนตัวได้
คีย์เวิร์ด Final เป็นอีกวิธีหนึ่งในการจำกัดการเข้าถึงวิธีการของสมาชิก คลาสย่อยไม่สามารถแทนที่วิธีการที่ทำเครื่องหมายว่าเป็นขั้นสุดท้ายในคลาสพาเรนต์ และไม่สามารถใช้คีย์เวิร์ด Final สำหรับแอตทริบิวต์ได้