Visibility
การมองเห็น ฟังแล้วดูแปลกๆ คือการเข้าถึง properties หรือ method ( function ) โดยมีสามคำหลักๆคือ public , private , protected โดย
- public คือเข้าถึงได้หมดไม่ว่าจะไหนก็ตาม
- protected เข้าถึงจากตัวเองได้และตัวที่สืบทอด
- private เข้าถึงจากตัวเองเท่านั้น
Property Visibility
การประกาศการเข้าถึงเราสามารถประกาศด้วย 3 ตัวด้านบนโดยถ้าหากใครประกาศเป็น Var ก็ถือว่าเป็น public โดยปริยาย
<?php /** * Define MyClass */ class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // Works echo $obj->protected; // Fatal Error echo $obj->private; // Fatal Error $obj->printHello(); // Shows Public, Protected and Private /** * Define MyClass2 */ class MyClass2 extends MyClass { // We can redeclare the public and protected method, but not private protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; // Works echo $obj2->protected; // Fatal Error echo $obj2->private; // Undefined $obj2->printHello(); // Shows Public, Protected2, Undefined ?>
จากตัวอย่าง Myclass2 สือทอดจาก MyClass เราจะสามารถเรียกใช้ตัวแปร public ได้ แต่ตัว protected เราจะเรียกจากข้างนอกไม่ได้ มันใช้ได้ในตัวของ class เองเช่นใน class มี method ที่เรียกใช้ตัวแปร protected จะสามารถเข้าถึงได้ ดูจากตอนที่มันทำการเรียก printHello() function นี้ทำการเข้าถึงตัวแปร protected แต่การเรียกใช้จากข้างนอกเช่น echo $obj->protected อย่างนี้ไม่ได้
และ private จะไม่ยอมให้ class ลูกหรือ class ที่สืบทอดเข้าถึงด้วยดูจาก $obj2 ที่เรียกมันจะ undefined นั่นเอง
Method Visibility
method ต่างๆที่ถูกประกาศจะเหมือนกับตัวแปร property เลยคือมีสามตัวและถ้าไม่ประกาศจะถือว่าเป็น public
<?php /** * Define MyClass */ class MyClass { // Declare a public constructor public function __construct() { } // Declare a public method public function MyPublic() { } // Declare a protected method protected function MyProtected() { } // Declare a private method private function MyPrivate() { } // This is public function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass->MyPublic(); // Works $myclass->MyProtected(); // Fatal Error $myclass->MyPrivate(); // Fatal Error $myclass->Foo(); // Public, Protected and Private work /** * Define MyClass2 */ class MyClass2 extends MyClass { // This is public function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); // Fatal Error } } $myclass2 = new MyClass2; $myclass2->MyPublic(); // Works $myclass2->Foo2(); // Public and Protected work, not Private class Bar { public function test() { $this->testPrivate(); $this->testPublic(); } public function testPublic() { echo "Bar::testPublic\n"; } private function testPrivate() { echo "Bar::testPrivate\n"; } } class Foo extends Bar { public function testPublic() { echo "Foo::testPublic\n"; } private function testPrivate() { echo "Foo::testPrivate\n"; } } $myFoo = new Foo(); $myFoo->test(); // Bar::testPrivate // Foo::testPublic ?>
อธิบายได้เหมือนกันเลยคือ protected ไม่สามารถถูกเรียกใช้จากด้านนอกได้เลย ต้องเป็นภายในตัว class หรือ class ที่สืบทอดเท่านั้น และ method ที่ private ก็จะไม่สามารถประกาศทับได้ดูจากสุดท้ายที่เป็น Bar::testPrivate นั่นแหละ
Visibility from other objects
ต่อให้เป็น object เดียวแต่การเข้าถึงจะเข้าถึงพวก protected , private ได้แต่มันถือว่าเป็นคนละตัวกัน ไปดูตัวอย่าง
<?php class Test { private $foo; public function __construct($foo) { $this->foo = $foo; } private function bar() { echo 'Accessed the private method.'; } public function baz(Test $other) { // We can change the private property: $other->foo = 'hello'; var_dump($other->foo); // We can also call the private method: $other->bar(); } } $test = new Test('test'); $test->baz(new Test('other')); ?>
ค่าที่ได้จะเป็น
string(5) "hello" Accessed the private method.