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.



