บทนำ
ใน PHP สามารถมีชนิดข้อมูลร่วมที่ผู้ใช้กำหนดเองได้ด้วยคีย์เวิร์ด class อินสแตนซ์ใหม่ของคลาสคืออ็อบเจ็กต์ ลักษณะเฉพาะของอ็อบเจ็กต์ขึ้นอยู่กับการกำหนดคลาส ซึ่งอาจมีสมาชิก property, constant และ method
การเข้าถึง (accessibility) หรือที่เรียกว่า visibility ของสมาชิกคลาส ขึ้นอยู่กับคีย์เวิร์ด visibility prefix ที่แนบในการกำหนด PHP มีคีย์เวิร์ด visibility สามตัว - public, private และ protected สมาชิกคลาสที่ประกาศด้วย public keyword เข้าถึงได้จากทุกที่ สมาชิก protected เข้าถึงได้จากภายในคลาสของมันและโดยคลาสที่สืบทอด (inheriting class) ส่วนสมาชิก private เข้าถึงได้เฉพาะคลาสเดียวกันที่มันถูกกำหนด และมองไม่เห็นจากภายนอก
Property Visibility (การมองเห็นของคุณสมบัติ)
คุณสมบัติ (property) เป็นแอตทริบิวต์ของอินสแตนซ์คลาส อาจเป็น instance property (มีค่าต่างกันสำหรับแต่ละอ็อบเจ็กต์) หรือ class property พร้อมค่าเดียวกันสำหรับทุกอ็อบเจ็กต์ คุณสมบัติอาจเป็นชนิดข้อมูล PHP ที่ถูกต้องใดๆ คุณสมบัติมี public visibility โดยค่าเริ่มต้น หากคุณสมบัติถูกกำหนดด้วยคีย์เวิร์ด var (ซึ่งถูกยกเลิกแล้ว) จะถูกจัดการเป็น public
ตัวอย่าง
<?php class myclass{ public $fname="Ajay"; var $lname; //ถูกจัดการเป็น public private $marks=100; protected $age=20; } $obj=new myclass(); echo "$obj->fname\n"; $obj->lname="Diwan"; echo "$obj->marks\n"; $obj->age=21; ?>
ผลลัพธ์
Ajay PHP Fatal error: Uncaught Error: Cannot access private property myclass::$marks PHP Fatal error: Uncaught Error: Cannot access protected property myclass::$age
อย่างไรก็ตาม คุณสมบัติ private และ protected สามารถใช้ภายในฟังก์ชันในคลาสเดียวกันได้:
ตัวอย่าง
<?php class myclass{ public $fname="Ajay"; var $lname; private $marks=100; protected $age=20; function displaydata(){ $this->lname="Diwan"; echo "$this->fname $this->lname\n"; echo "marks=$this->marks age=$this->age"; } } $obj=new myclass(); $obj->displaydata(); ?>
ผลลัพธ์
Ajay Diwan marks=100 age=20
Method Visibility (การมองเห็นของเมธอด)
เหมือนคุณสมบัติคลาส เมธอดคลาสก็สามารถกำหนด visibility ด้วย public, private และ protected keywords เมธอดก็โดยค่าเริ่มต้นถูกจัดเป็น public
ตัวอย่าง
<?php class myclass{ public $fname="Ajay"; var $lname; private $marks=100; protected $age=20; public function setname(){ $this->fname="Anil"; $this->lname="Dave"; echo "name changed\n"; } private function setmarks(){ $this->marks=90; } protected function setage(){ $this->age=21; } function setdata(){ $this->setname(); $this->setmarks(); $this->setage(); } function displaydata(){ $this->lname="Diwan"; echo "$this->fname $this->lname\n"; echo "marks=$this->marks age=$this->age"; } } $obj=new myclass(); $obj->setname();//works $obj->setmarks();//error $obj->setage();//error $obj->setdata(); //private และ protected methods ถูกเรียกภายใน public method $obj->displaydata(); ?>
ผลลัพธ์
name changed PHP Fatal error: Uncaught Error: Call to private method myclass::setmarks() from context '' PHP Fatal error: Uncaught Error: Call to protected method myclass::setage() from context '' Anil Dave marks=90 age=21
Method Visibility ในการสืบทอด (Inheritance)
เมธอดของ Parent class สามารถ override ในการกำหนด child class ได้ เมธอด private และ protected ของ parent ไม่พร้อมใช้งานสำหรับอ็อบเจ็กต์ของ child class เมธอดที่เป็น protected ใน parent สามารถใช้ในเมธอดของ child class ได้
ตัวอย่าง
<?php class testclass{ public $x=10; private $y=20; protected $z=30; private function test(){ echo "testclass private method\n"; } public function test1(){ echo "testclass public method\n"; } protected function test2(){ echo "testclass protected method\n"; } function test3(){ echo "x=$this->x y=$this->y z=$this->z\n"; } } class newclass extends testclass{ function test1(){ echo "newclass public method\n"; } public function test4(){ $this->test(); $this->test1(); $this->test2(); } } $obj=new newclass(); echo $obj->test1(); echo $obj->test3(); echo $obj->test4(); ?>
ผลลัพธ์
newclass public method x=10 y=20 z=30 PHP Fatal error: Uncaught Error: Call to private method testclass::test() from context 'newclass'
Constant Visibility (การมองเห็นของค่าคงที่)
ตั้งแต่ PHP 7.1 ขึ้นไป visibility modes สามารถใช้กับ constants ได้ Default visibility ของ constant คือ public
ตัวอย่าง
<?php class testclass{ public const X=10; private const Y=20; protected const Z=30; function showconst(){ echo "x=" . self::X ; echo "y=" . self::Y; echo "z=" . self::Z ; } } $obj=new testclass(); $obj->showconst(); echo testclass::Y . "\n"; echo testclass::Z . "\n"; ?>
ผลลัพธ์
x=10y=20z=30 PHP Fatal error: Uncaught Error: Cannot access private const testclass::Y PHP Fatal error: Uncaught Error: Cannot access protected const testclass::Z