21/5/15

Bài 06: Các mức truy cập private protected và public

Trong tính kế thừa, tất cả các thuộc tính và phương thức của đối tượng cha đều sử dụng được ở đối tượng con. Nhưng thực tế có những thuộc tính và phương thức ở đối tượng cha ta không muốn hàm con truy cập vào, cũng như ở đối tương con có những thuộc tính và phương thức chỉ muốn sử dụng riêng chứ không được truy xuất tới. Để giải quyết vấn đề này trong lập trình hướng đối tượng các mức truy cập private, protected và public ra đời.

1. Mức Truy Cập Private

Đây là thành phần dành riêng cho lớp không được truy xuất với bất kỳ một lớp nào khác (lớp kế thừa nó) hoặc ở bên ngoài, nó chỉ dành riêng cho việc xử lý nội bộ.
Mức truy cập private thường được sử dụng với:
- Các thuộc tính dữ liệu nhằm bảo vệ chúng, tránh sự truy cập tự do từ bên ngoài, các thuộc tính này sẽ có những hàm SET và GET để nhập và xuất dữ liệu.
- Các phương thức trung gian tính toán trong nội bộ của đối tượng mà ta k muốn bên ngoài biết đến dòng code của nó.

Ví dụ không kế thừa:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Lớp Xe
class Xe
{
    private $loaixe;
  
    function getLoaixe()
    {
         return $this->loaixe;
    }
  
    function setLoaixe($loaixe)
    {
            $this->loaixe = $loaixe;
    }
}
  
// Khởi tạo một lớp đối tượng xe
$xe new Xe();
  
// Gán giá trị cho thuộc tính loại xe
$xe->setLoaixe('Wave S');
  
// Lấy giá trị thuộc tính loại xe
echo $xe->getLoaixe();  // kết quả xuất ra Wave S

Ở ví dụ trên muốn truy xuất giá trị thuộc tính loaixe thì phải thông qua phương thức setLoaixe và getLoaixe chứ không thể trỏ thẳng trực tiếp đến thuộc tính loaixe vì thuộc tính loaixe đang ở mức private

Như bài này là sai:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Lớp Xe
class Xe
{
    private $loaixe;
  
    function getLoaixe()
    {
        return $this->loaixe;
    }
  
    function setLoaixe($loaixe)
    {
        $this->loaixe = $loaixe;
    }
}
  
// Khởi tạo một lớp đối tượng xe
$xe new Xe();
  
// Gán giá trị cho thuộc tính loại xe
// nhưng sai tại vì loaixe đang ở mức private
// nên không thể truy xuất bên ngoài
$xe->loaixe = 'Wave S';
  
// Lấy giá trị thuộc tính loại xe
// cũng sai vì loaixe là private
echo $xe->loaixe;

Ví dụ có kế thừa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
// Lớp Xe
class Xe
{
    private $loaixe;
  
    var $tenxe;
  
    function getLoaixe()
    {
        return $this->loaixe;
    }
  
    function setLoaixe($loaixe)
    {
        $this->loaixe = $loaixe;
    }
  
    private function xoaLoaixe()
    {
        echo 'Hàm xóa loại xe';
    }
}
  
// Kế thừa từ lớp xe
class XeHonda extends Xe
{
    function hienThiThongTin()
    {
        // lệnh này đúng
        echo $this->tenxe;
  
        // lệnh này sai vì thuộc tính loaixe là
        // private trong lớp cha
        echo $this->loaixe;
  
        // lệnh này đúng
        $this->setLoaixe('Wave S');
  
        // lệnh này đúng
        echo $this->getLoaixe();
  
        /// Lệnh này sai vì hàm xoaLoaixe là
        // private trong lớp cha
        $this->xoaLoaixe();
    }
}
  
// -------------------
// Chương trình chính//
// -------------------
  
// Khởi Tạo mới lớp xe hon da
$xehonda new XeHonda();
  
// Gọi hàm hienThiThongTin trong lớp XeHonda
// Các bạn kiểm tra trong hàm này để xem các
// lỗi mà tôi đã ghi chú
$xehonda->hienThiThongTin();
  
// Lệnh này đúng vì lớp XeHonda kế thừa lớp Xe nên
// nó được kế thừa các thuộc tính và hàm của lớp cha
$xehonda->setLoaixe('Suzuki');
echo $xehonda->getLoaixe();
  
// Lệnh này sai vì hàm xoaLoaixe trong lớp Xe là
// private nên lớp XeHonda không được kế thừa
$xehonda->xoaLoaixe();
Phần ghi chú tôi đã giải thích rõ rồi nên tôi không giải thích gì thêm.

2. Mức Truy Cập Protected

Mức truy cập protected chỉ cho phép truy xuất trong lớp đó và lớp kế thừa nó nên bên ngoài lớp đó sẽ không truy cập vào đc. Thường được dùng cho những lớp có khả năng bị kế thừa.
Ví dụ:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<strong>// Lớp Xe
class Xe
{
    protected $loaixe;
}
  
// Kế thừa từ lớp xe
class XeHonda extends Xe
{
    function hienThiThongTin()
    {
        // Lệnh này đúng vì loaixe đang ở
        // mức protected nên nó được kế thừa
        $this->loaixe = 'Wave S';
    }
    protected function suaChuaXe()
    {
        // Lệnh
    }
}
  
// ------------------//
// Chuong Trình Chính//
// ------------------//
  
$honda new XeHonda();
  
// Lệnh này sai vì loaixe đang
// ở mức protected nên ở bên ngoài lớp
// không được truy xuất vào
$honda->loaixe = 'Wave Tàu';
  
// Lệnh này đúng
$honda->hienThiThongTin();
  
// Lệnh này sai vì: function suaChuaXe đang
// ở mức protected nên ko thể truy xuất
// từ ngoài lớp XeHonDa
$honda->suaChuaXe();</strong>

3. Mức Truy Cập Public

Thành phần này là dễ chịu nhất, bạn có thể truy cập bất kỳ ở đâu từ trong bản thân lớp đó đến lớp kế thừa và cả bên ngoài.
Khi khai báo thuộc tính là public ta có thể dùng từ khóa var để thay thế cho public như những ví dụ các bài trước.
Ví Dụ
1
2
3
4
5
6
7
class Xe
{
    private $loaixe// Mức private
    protected $tenxe// Mức protected
    var $sokhung// Mức public
    public $soseri// Mức public
}

Khi khai báo với hàm là public nếu ta không đặt từ public ở đầu thì php sẽ tự hiểu hàm này là public.
Ví dụ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Xe
{
    // Ở dạng public vì ta không có từ khóa gì ở trước
    function showTenXe()
    {
        // lệnh
    }
  
    // Ở dạng public vì có từ khóa public ở trước
    public function showHangXe()
    {
        // lệnh
    }
  
    // Ở dạng private vì có từ khóa private ở trước
    private function setTenxe()
    {
        // lệnh
    }
  
    // Ở dạng protected vì có từ khóa protected ở trước
    protected function getTenXe()
    {
        // lệnh
    }
}

Kết Thúc Bài Học

Còn mấy mức nữa nhưng trong bài này không đề cập tới, vì thực tế thì nó rất ít sử dụng. Bài tiếp theo ta sẽ tìm hiểu tính kế thừa lồng trong php nhé.
Nguồn: (code.freetuts.net)

0 nhận xét: