PHP Class and Object

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.
Loading

เป็นโปรแกรมเมอร์ที่ตามหาคุณค่าของชีวิตและความฝันในวัยเด็ก ชอบเล่นเกม เรียนรู้ทุกอย่าง ชอบเจอคนใหม่ๆ งานสังคมทุกชนิด ออกกำลังกายในวันว่าง อ่านหนังสือ มีเว็บรีวิวหนังสือด้วย www.readraide.in.th