post-image

Mức độ truy cập (visibility) của các thành phần

Lập trình Hướng Đối tượng

Mức độ truy cập (visibility) của một thuộc tính (property), một phương thức (method) hoặc một hằng số (constant) có thể được quy định bằng cách sử dụng một trong các từ khoá publicprotected hoặc private. Các thành phần được khai báo public thì có thể được truy cập từ bất cứ đâu. Các thành phần được khai báo protected thì chỉ được phép truy cập từ bên trong lớp đó, hoặc bên trong các lớp con hoặc lớp cha. Các thành phần được khai báo private thì chỉ được phép truy cập duy nhất bên trong bản thân lớp đó.

Các từ khoá public, protected và private còn được gọi là access modifier, tức là các từ khoá dùng để thay đổi mức độ truy cập của các thành phần.

Mức độ truy cập đến các thuộc tính

Các thuộc tính của lớp cần được khai báo là public, protected hoặc private. Nếu thuộc tính được khai báo bằng từ khoá var thì mặc định sẽ có mức độ truy cập là public.

Ví dụ:

<?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 properties, but not private
    public $public = 'Public2';
    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 Public2, Protected2, Undefined

?>

Mức độ truy cập của phương thức

Các phương thức của một lớp có thể được khai báo là public, protected hoặc private. Nếu mức độ truy cập không được khai báo tường minh thì mặc định sẽ là public.

Ví dụ:

<?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
?>

Mức độ truy cập của hằng

Các hằng trong một lớp có thể được khai báo public, protected hoặc private. Nếu mức độ truy cập không được khai báo tường minh thì mặc định là public.

Ví dụ:

<?php
/**
 * Define MyClass
 */
class MyClass
{
    // Declare a public constant
    public const MY_PUBLIC = 'public';

    // Declare a protected constant
    protected const MY_PROTECTED = 'protected';

    // Declare a private constant
    private const MY_PRIVATE = 'private';

    public function foo()
    {
        echo self::MY_PUBLIC;
        echo self::MY_PROTECTED;
        echo self::MY_PRIVATE;
    }
}

$myclass = new MyClass();
MyClass::MY_PUBLIC; // Works
MyClass::MY_PROTECTED; // Fatal Error
MyClass::MY_PRIVATE; // Fatal Error
$myclass->foo(); // Public, Protected and Private work


/**
 * Define MyClass2
 */
class MyClass2 extends MyClass
{
    // This is public
    function foo2()
    {
        echo self::MY_PUBLIC;
        echo self::MY_PROTECTED;
        echo self::MY_PRIVATE; // Fatal Error
    }
}

Kết quả của đoạn mã trên sẽ là:

string(5) "hello"
Accessed the private method.



$myclass2 = new MyClass2;
echo MyClass2::MY_PUBLIC; // Works
$myclass2->foo2(); // Public and Protected work, not Private
?>

Truy cập từ các đối tượng khác

Các đối tượng thuộc cùng một kiểu có thể truy cập đến các thành phần private và protected của các đối tượng khác, kể cả trong trường hợp chúng không phải là cùng một thực thể. Điều này là bởi vì các triển khai cụ thể (specific implementation) của các thành phần này đều đã biết ngay bên trong các đối tượng đó.

Ví dụ: 

<?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'));
?>

Kết quả của đoạn mã trên sẽ là:

string(5) "hello"
Accessed the private method.

Leave a Reply

Your email address will not be published. Required fields are marked *