Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Chế độ hiển thị (Visibility modes) trong PHP

Giới thiệu

Trong PHP, có thể định nghĩa kiểu dữ liệu phức hợp do người dùng tạo bằng từ khóa class. Instance mới của class là object. Đặc điểm của object phụ thuộc vào định nghĩa class, có thể chứa property, constant và method.

Khả năng truy cập (visibility) của thành viên class phụ thuộc từ khóa visibility prefix trong định nghĩa. PHP có 3 visibility keywords: public, private và protected. Thành viên public truy cập được từ bất cứ đâu. protected truy cập từ trong class và class kế thừa. private chỉ truy cập được trong class định nghĩa nó, không visible bên ngoài.

Property Visibility

Property là thuộc tính của instance class. Có thể là instance property (giá trị khác nhau cho mỗi object) hoặc class property (static, cùng giá trị cho mọi object). Property có thể là bất kỳ kiểu PHP hợp lệ nào. Mặc định property là public. Nếu dùng từ khóa var (đã deprecated), nó được coi là public.

Ví dụ

Property với các visibility

<?php
class MyClass {
    public $fname = "Ajay";
    var $lname; // được coi là public
    private $marks = 100;
    protected $age = 20;
}
$obj = new MyClass();
echo "$obj->fname\n";
$obj->lname = "Diwan";
echo "$obj->marks\n";      // Lỗi: private
$obj->age = 21;            // Lỗi: protected
?>

Kết quả

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 property dùng trong class

Tuy nhiên, private và protected property có thể dùng trong method cùng class:

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

Kết quả

Ajay Diwan
marks=100 age=20

Method Visibility

Giống property, method cũng gán visibility bằng public, private, protected. Mặc định method là public.

Ví dụ method visibility

<?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();     // OK - public
$obj->setmarks();    // Lỗi - private
$obj->setage();      // Lỗi - protected
$obj->setdata();     // Private/protected được gọi trong public method
$obj->displaydata();
?>

Kết quả

name changed
PHP Fatal error: Uncaught Error: Call to private method MyClass::setmarks()
PHP Fatal error: Uncaught Error: Call to protected method MyClass::setage()
Anil Dave
marks=90 age=21

Method Visibility trong Inheritance (Kế thừa)

Method của Parent class có thể override trong Child class. Private và protected method của parent không khả dụng cho object của child. Tuy nhiên, method protected trong parent có thể dùng trong method của child class.

Ví dụ

<?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();   // private parent - lỗi
        $this->test1();  // public parent - OK
        $this->test2();  // protected parent - OK trong child method
    }
}
$obj = new NewClass();
echo $obj->test1();
echo $obj->test3();
echo $obj->test4();
?>

Kết quả

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

Từ PHP 7.1, visibility modes dùng được cho constants. Default visibility của constant là 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";  // Lỗi private
echo TestClass::Z . "\n";  // Lỗi protected
?>

Kết quả

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