PHP: private, protected và public

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Tầm vực của thuộc tính hay phương thức có thể được định nghĩa bằng cách đặt phía trước tên thuộc tính từ khóa publicprotected hoặc private. Các thành phần lớp được khai báo là public có thể được truy cập ở mọi nơi. Các thành phần protected chỉ có thể được truy cập trong lớp chứa chúng và trong lớp con của lớp đó. Các thành phần private chỉ có thể được truy cập từ lớp chứa chúng.

Tầm vực của thuộc tính

Các thuộc tính của lớp được khai báo kèm từ khóa public, private hoặc protected. Nếu thuộc tính nào được khai báo sử dụng từ khóa var thì thuộc tính đó mặc định có tầm vực là public.

Ví dụ 1: Khai báo thuộc tính.

<?php
/**
 * Định nghĩa 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// Làm việc
echo $obj->protected// Lỗi
echo $obj->private// Lỗi
$obj->printHello(); // Hiển thị Public, Protected and Private


/**
 * Định nghĩa MyClass2
 */

class MyClass2 extends MyClass
{
    
// Ta có thể khai báo lại phương thức public và protected, nhưng không được private
    
protected $protected 'Protected2';

    function 
printHello()
    {
        echo 
$this->public;
        echo 
$this->protected;
        echo 
$this->private;
    }
}


$obj2 = new MyClass2();
echo 
$obj2->public// Làm việc
echo $obj2->protected// Lỗi
echo $obj2->private// Không định nghĩa
$obj2->printHello(); // Hiển thị Public, Protected2, Undefined

?>

 Lưu ý: PHP 4 vẫn hỗ trợ việc khai báo biến với từ khóa var. PHP 5 trước 5.1.3 thì việc sử dụng var sẽ phát sinh cảnh báo E_STRICT.

Tầm vực của phương thức

Các phương thức của lớp có thể được định nghĩa là public, private hoặc protected. Những phương thức khai báo mà không có từ khóa tầm vực sẽ mặc định là public.

Ví dụ 2: Khai báo phương thức.

<?php
/**
 * Định nghĩa MyClass
 */

class MyClass
{
    
// Định nghĩa hàm tạo public
    
public function __construct() { }

    
// Định nghĩa phương thức public
    
public function MyPublic() { }

    
// Định nghĩa phương thức protected
    
protected function MyProtected() { }

    
// Định nghĩa phương thức private
    
private function MyPrivate() { }

    
// Phương thức này sẽ có tầm vực là public
    
function Foo()
    {
        
$this->MyPublic();
        
$this->MyProtected();
        
$this->MyPrivate();
    }
}


$myclass = new MyClass;
$myclass->MyPublic(); // OK
$myclass->MyProtected(); // Lỗi
$myclass->MyPrivate(); // Lỗi
$myclass->Foo(); // Public, Protected và Private


/**
 * Định nghĩa MyClass2
 */

class MyClass2 extends MyClass
{
    
// public
    
function Foo2()
    {
        
$this->MyPublic();
        
$this->MyProtected();
        
$this->MyPrivate(); // Fatal Error
    
}
}


$myclass2 = new MyClass2;
$myclass2->MyPublic(); // OK
$myclass2->Foo2(); // Public và Protected làm việc, Private thì không

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

?>

Tầm vực của những đối tượng khác nhau

Các đối tượng có cùng kiểu có thể truy cập tới các thành phần private và protected mặc dù chúng không cùng thể hiện. Lý do là bởi vì việc thực thi những chi tiết cụ thể luôn được biết đến khi ở bên trong các đối tượng đó.

Ví dụ 3: Truy cập các thành phần private của các đối tượng cùng kiểu.

<?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)
    {
        
// Ta có thể thay đổi giá trị của thuộc tính private:
        
$other->foo 'hello';
        
var_dump($other->foo);

        
// Ta cũng có thể gọi được phương thức private:
        
$other->bar();
    }
}


$test = new Test('test');

$test->baz(new Test('other'));
?>

Ví dụ trên output như sau:

string(5) "hello"
Accessed the private method.
» Tiếp: Hàm tạo (Constructor) và hàm hủy (Destructor)
« Trước: Class và Object (Lớp và Đối tượng)
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!