วิธีการเข้าถึงของ PHP5 ช่วยให้คุณสามารถจำกัดการเข้าถึงสมาชิกของคลาสได้ นี่เป็นคุณลักษณะใหม่ใน PHP5 แต่มีอยู่แล้วในภาษาเชิงวัตถุหลายภาษา ด้วยวิธีการเข้าถึง คุณสามารถพัฒนาแอปพลิเคชันเชิงวัตถุที่เชื่อถือได้และสร้างวัตถุที่นำมาใช้ใหม่ได้ ไลบรารี่ที่มุ่งเน้น
PHP มีวิธีการเข้าถึงสามวิธี: สาธารณะ ส่วนตัว และการป้องกัน สำหรับวิธีการเข้าถึงของสมาชิกคลาส อาจเป็นหนึ่งในนั้น หากคุณไม่ระบุวิธีการเข้าถึง การเข้าถึงจะเป็นค่าเริ่มต้น วิธีการนี้เป็นแบบสาธารณะ คุณยังสามารถระบุวิธีการเข้าถึงสำหรับสมาชิกแบบคงที่ได้โดยวางวิธีการเข้าถึงไว้หน้าคีย์เวิร์ดแบบคงที่ (เช่น สาธารณะแบบคงที่)
สมาชิกแบบสาธารณะสามารถเข้าถึงได้โดยไม่มีข้อจำกัด คุณสามารถเรียกวิธีการสาธารณะได้จากทุกที่ในสคริปต์ของคุณ ใน PHP เวอร์ชันก่อนหน้า วิธีการและคุณสมบัติทั้งหมดเป็นแบบสาธารณะ ซึ่งทำให้วัตถุรู้สึกเหมือนมีโครงสร้างอาร์เรย์ที่สวยงาม
เท่านั้น คุณไม่สามารถเปลี่ยนแปลงหรืออ่านค่าได้ ของคุณสมบัติส่วนตัวที่อยู่นอกคลาสที่มันอยู่ ในทำนองเดียวกัน เฉพาะวิธีการภายในคลาสเดียวกันเท่านั้นที่สามารถเรียกใช้คลาสย่อยส่วนตัว
ได้ คลาสสามารถเข้าถึงสมาชิกส่วนตัวได้ ดูตัวอย่างที่ 6.8 วิธีการเปรียบเทียบสองวิดเจ็ต ตัวดำเนินการ == เปรียบเทียบสองวิดเจ็ตของคลาสเดียวกัน แต่ในตัวอย่างนี้แต่ละอินสแตนซ์ของวัตถุมี ID ที่ไม่ซ้ำกันเท่านั้น และราคา สังเกตว่าเมธอดเท่ากับเข้าถึงคุณสมบัติส่วนตัวของอินสแตนซ์ Widget อื่นได้อย่างไร ทั้ง Java และ C อนุญาตการดำเนินการ
นี้
วิดเจ็ตคลาส
-
ชื่อ $ ส่วนตัว;
ราคา $ ส่วนตัว;
ส่วนตัว $id;
ฟังก์ชั่นสาธารณะ __construct($name, $price)
-
$นี่->ชื่อ = $ชื่อ;
$นี่->ราคา = floatval($ราคา);
$นี่->id = uniqid();
-
//ตรวจสอบว่าวิดเจ็ตสองตัวเหมือนกันหรือไม่ ตรวจสอบว่าวิดเจ็ตสองตัวเหมือนกันหรือไม่
ฟังก์ชั่นสาธารณะเท่ากับ ($widget)
-
return(($this->name == $widget->name)AND
($นี่->ราคา == $วิดเจ็ต->ราคา));
-
-
$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");
-
?>
หากคุณยังใหม่กับการเขียนโปรแกรมเชิงวัตถุ คุณอาจสงสัยว่าจุดประสงค์ของการใช้สมาชิกส่วนตัวคืออะไร คุณอาจจำแนวคิดของการห่อหุ้มและการมีเพศสัมพันธ์ ซึ่งเราได้พูดคุยกันในตอนต้นของบทนี้ สมาชิกส่วนตัวช่วยห่อหุ้มข้อมูล พวกเขาสามารถซ่อนอยู่ภายในคลาสโดยไม่ต้องเข้าถึงด้วยโค้ดภายนอกคลาส นอกจากนี้ยังช่วยให้เกิดการเชื่อมต่อแบบหลวม ๆ หากโค้ดนอกโครงสร้างข้อมูลไม่สามารถเข้าถึงคุณสมบัติภายในได้โดยตรงจะไม่มีความสัมพันธ์โดย
นัย คุณสมบัติส่วนตัวยังคงสามารถใช้ร่วมกันโดยรหัสภายนอก วิธีแก้ไขคือการใช้วิธีการสาธารณะคู่หนึ่งคือรับ (รับมูลค่าของคุณสมบัติ) อีกวิธีหนึ่งถูกตั้งค่า (ตั้งค่าของคุณสมบัติเช่นกัน) ค่าเริ่มต้น สิ่งนี้ทำให้การสื่อสารระหว่างสมาชิกเกิดขึ้นผ่านอินเทอร์เฟซที่แคบและมีคุณสมบัติเหมาะสม นอกจากนี้ยังให้โอกาสในการเปลี่ยนค่าที่ส่งผ่านไปยังเมธอด ))
สมาชิกที่ได้รับการป้องกันสามารถเข้าถึงได้โดยวิธีการทั้งหมดในคลาสเดียวกันและในคลาสที่สืบทอดมานั้นละเมิดเจตนารมณ์ของการห่อหุ้มเนื่องจากคลาสย่อยต้องอาศัยการเขียนคุณลักษณะเฉพาะไปยังคลาสย่อยที่ได้รับการป้องกัน การใช้เมธอดที่ได้รับการป้องกันจะต้องมีความชัดเจนเกี่ยวกับโครงสร้างของคลาสพาเรนต์
โปรดทราบว่าขณะนี้ Widget มีเมธอดที่ได้รับการป้องกันที่เรียกว่า getName หากอินสแตนซ์ของ Widget พยายามเรียกใช้เมธอดที่ได้รับการป้องกัน จะเกิดข้อผิดพลาด: $w1->getName( ) ทำให้เกิดข้อผิดพลาด แต่เมธอด getName ในคลาสย่อย Thing สามารถเรียกเมธอดที่ได้รับการป้องกันนี้ได้ แน่นอนว่า เพื่อพิสูจน์ว่าเมธอด Widget::getName ได้รับการปกป้อง ตัวอย่างนี้ดูเหมือนง่ายเกินไป ในสถานการณ์จริง การใช้เมธอดที่ได้รับการป้องกันจะขึ้นอยู่กับ ทำความเข้าใจโครงสร้างภายในของวัตถุ
<?php
วิดเจ็ตคลาส
-
ชื่อ $ ส่วนตัว;
ราคา $ ส่วนตัว;
ส่วนตัว $id;
ฟังก์ชั่นสาธารณะ __construct($name, $price)
-
$นี่->ชื่อ = $ชื่อ;
$นี่->ราคา = floatval($ราคา);
$นี่->id = uniqid();
}
//ตรวจสอบว่าวิดเจ็ตสองตัวเหมือนกันหรือไม่
ฟังก์ชั่นสาธารณะเท่ากับ ($widget)
-
return(($this->name == $widget->name)AND
($นี่->ราคา == $วิดเจ็ต->ราคา));
}
ฟังก์ชันที่ได้รับการป้องกัน 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 เป็นอีกวิธีหนึ่งในการจำกัดการเข้าถึงเมธอดของสมาชิก คลาสย่อยไม่สามารถแทนที่เมธอดที่ถูกทำเครื่องหมายเป็นขั้นสุดท้ายในคลาสพาเรนต์ได้