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 lớp cha đều sử dụng được ở lớp con. Nhưng thực tế có những thuộc tính và phương thức ở lớp cha không muốn lớp con có thể truy cập vào. Cũng như ở lớp con, có những thuộc tính và phương thức chỉ muốn sử dụng riêng trong đối lớp đó thôi chứ không được truy xuất ở ngoài lớp. Để giải quyết vấn đề này ta sẽ tìm hiểu các mức truy cập private protected và public trong lập trình hướng đối tượng.

Nội dung chính:

  • 1. Mức truy cập private
  • 2. Truy cập protected
  • 3. Độ truy cập public
  • 4. Lời kết

1. Mức truy cập private

Đây là thành phần chỉ dành riêng cho nội bộ của lớp. Nghĩa là ta không thể truy xuất tới thành phần private ở lớp con hoặc ở bên ngoài lớp.

Mức truy cập private thường hay đượ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 gán và lấy 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 không muốn bên ngoài có thể can thiệp vào

Ví dụ không kế thừa:

Hoc lap trinh php nang cao phan 3

Ở trong 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 của loaixe đang ở mức private.

Như bài này là sai:

Hoc lap trinh php nang cao phan 3

2. Truy cập protected

Mức truy cập protected chỉ cho phép ta truy xuất nội bộ trong lớp đó và lớp kế thừa. Riêng ở bên ngoài lớp sẽ không truy xuất được. Mức protected thường được dùng cho những phương thức và thuộc tính có khả năng bị lớp con định nghĩa lại (overwrite).

Ví dụ:

Hoc lap trinh php nang cao phan 3

3. Độ truy cập public

Đây là mức truy cập thoáng nhất bởi vì bạn có thể truy cập tới các phương thức và thuộc tính ở bất cứ đâu, dù trong nội bộ của lớp hay ở lớp con hay cả bên ngoài lớp đều được.

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ụ:

Hoc lap trinh php nang cao phan 3

Khi khai báo với hàm là public nếu chúng ta không đặt từ public ở đầu thì PHP sẽ tự hiểu hàm này là public.

Ví dụ:

Hoc lap trinh php nang cao phan 3

Bài 07: Kế thừa lồng trong php

private, protectedpublic. Trước tiên chúng ta tìm hiểu khái niệm kế thừa lồng là gì đã nhé.

Nội dung chính

  • 1. Kế thừa lồng là gì?
  • 2. Các mức độ truy cập bên trong kế thừa lồng.

1. Kế thừa lồng là gì?

Kế thừa lồng hay còn được gọi là kế thừa nhiều lớp có nghĩa là một lớp được kế thừa từ nhiều lớp. Lớp B kế thừa lớp A, lớp C kế thừa lớp B và thế là ta có luồng kế thừa  A -> B -> C. Một ví dụ khác thực tế hơn, giả sử Ông mình sinh ra Ba mình, Ba mình sinh ra mình như vậy mình kế thừa dòng máu của Ông mình và Ba mình.

Ví dụ:

Nhìn ví dụ thật đơn giản phải không nào, nhưng đi sâu vào bên trong thì nó không đơn giản tí nào đâu. Vấn đề đặt ra là khi kế thừa nhiều cấp như vậy thì các biến (thuộc tính), các hàm (phương thức) ở các lớp cha được sử dụng ở lớp con như thế nào? Để hiểu rõ hơn vấn đề này ta sẽ đi qua phần hai.

2. Các mức độ truy cập ở trong kế thừa lồng

Như chúng ta đã biết có 3 mức độ truy cập hay dùng nhất đó là private, public và protected. Cũng như trong kế thừa một cấp, tất cả những biến (thuộc tính) và hàm (phương thức) ở dạng public thì ở tất cả các lớp con dù ở cấp độ nào nó cũng có thể truy xuất vào được. Nếu là ở dạng private thì chỉ dùng trong lớp đó, còn nếu ở dạng protected thì tất cả các lớp kế thừa nó dù là lồng bao nhiêu lần thì cũng có thể sử dụng. Định nghĩa này chúng ta đã được học ở bài trước và cũng được giữ nguyên cho bài kế thừa lồng này.

Ví dụ:

Qua các phần ghi chú trong ví dụ tôi đã giải thích cho các bạn rồi. Như vậy là các bạn thấy nó cũng không có gì đặc biệt đúng không nào.

Bài 08: Khi nào thì sử dụng private, protected và public

Vấn đề lựa chọn cho mức độ truy cập cũng như cách đặt tên cho các thuộc tính và phương thức trong PHP là câu hỏi thường hay gặp đối với tất cả các bạn mới biết về lập trình hướng đối tượng. Vì thế qua bài này ta sẽ cùng thảo luận đôi điều về vấn đề này để mọi thứ trở nên dễ dàng hơn.

Nội dung bao gồm:

  • Khai báo tên thuộc tính để nhận dạng được độ truy cập
  • Hàm set và hàm get các thuộc tính
  • Khi nào sử dụng private
  • Ta nên sử dụng protected khi nào ?
  •  Sử dụng public

Nội dung chính

  • 1. Khai báo tên thuộc tính để nhận dạng các cấp độ truy cập.
    • Cách để chọn từ đặt cho tên biến và tên hàm
    • Khai báo tên biến dạng private
    • Cách khai báo biến dạng protected
    • Khai báo tên biến dạng public
  • 2. Hàm Set và hàm Get các thuộc tính
  • 3. Khi nào sử dụng cấp độ truy cập private
  • 4. Sử dụng cấp độ truy cập protected
  • 5. Cách sử dụng cấp độ truy cập public

1. Khai báo tên thuộc tính để nhận dạng các cấp độ truy cập

Tiêu đề nghe hơi lạ nhưng nó thực sự rất hữu ích trong quá trình làm việc nhóm cho các bạn đó. Nếu ở bên trong một team có những quy ước đặt tên biến, tên hàm riêng thì nhìn vào dòng code tuy do nhiều người làm nhưng lại trông như là chỉ có một người làm. Bởi vậy tôi đặt ra phần này để hướng dẫn tất cả các bạn cách đặt tên biến, tên hàm trong một lớp. Tuy nhiên không phải người nào cũng áp dụng như vậy nên các bạn đừng chém nhé. Các bạn đọc nhưng có quyền không làm theo.

Các cách chọn từ đặt cho tên biến và tên hàm

Bình thường tên biến (thuộc tính) phải là một danh từ hoặc tình từ, còn tên của hàm (phương thức) bắt đầu bằng một động từ.

Khai báo tên biến dạng private

Thường thường nếu biến ở dạng private thì tên biến các bạn nên đặt hai dấu gạch dưới rồi mới đến tên biến.

Ví dụ:

Khai báo tên biến dạng protected

Thường thì nếu ở dạng protected thì các bạn nên đặt một dấu gạch dưới rồi mới tới tên biến

Ví dụ:

Khai báo tên biến dạng public

Nếu ở dạng này bạn chỉ cần khai báo tên bình thường

2. Hàm Set và hàm Get các thuộc tính

Các thuộc tính ở trong đối tượng thường có hai thao tác là gán dữ liệu và lấy dữ liệu. Có những thuộc tính mà ta muốn khi gán giá trị hoặc khi lấy giá trị thì sẽ có một đoạn code tác động vào. Ví dụ như khi tôi muốn thiết lập mật khẩu cho người dùng, thì mật khẩu sẽ được tự động thêm một số ký tự đặc biệt. Mã hóa md5 để được an toàn và bảo mật hơn, như vậy mỗi lần gán giá trị cho thuộc tính mật khẩu tôi phải thêm một đoạn như thế này:

Giả sử đang trong quá trình lập trình tôi có sử dụng phép gán này 100 lần. Thì đôi lúc sẽ bị nhầm lẫn ký tự thêm vào, chưa tính đến chuyện sau này. Tôi muốn sửa thêm ký tự vào thành một chuỗi khác hoặc sử dụng hàm mã hóa khác thì tôi phải vào 100 dòng code đó để sửa lại.

Giả sử nếu tôi muốn khi lấy giá trị của thuộc tính username thì kết quả trả về sẽ có thêm một đoạn là “Xin Chào + Username“. Như vậy mỗi lần tôi lấy giá trị username phải bổ sung chữ xin chào vào. Nếu có 100 dòng code thì phải thực hiện thao tác này 100 lần và điều này khá phiền toái.

Qua tất cả những lý do đó, tôi nghĩ có giải pháp. Là ta tạo những hàm SET và GET dùng cho việc gán và lấy dữ liệu cho các thuộc tính. Username và password để sau này thay đổi thì chỉ cần vào hai hàm này sửa là được.

Quy tắc để đặt được tên cho Get và Set như sau: setThuoctinh()getThuoctinh().

Ví dụ:

3. Khi nào thì sử dụng cấp độ truy cập private

Thông thường để an toàn dữ liệu các thuộc tính đều ở dạng private. Nhưng điều này rất phiền vì chúng ta phải tạo thêm các hàm SET và GET. Nên các lập trình viên cũng ít khi sử dụng private. Tuy nhiên rất nhiều những trường hợp sau, ta bắt buộc phải dùng ở dạng private để an toàn cho đối tượng.

  • Những thuộc tính mà có tính biến đổi dữ liệu khi nhập và lấy dữ liệu như hai ví dụ về: Username và Password ở trên
  • Những phương thức chỉ dùng trong nội bộ trong lớp đó, không có sử dụng bên ngoài lớp

Đó là 2 đặc điểm cơ bản nhất để bạn chọn độ truy cập là private.

4. Khi nào thì sử dụng cấp độ truy cập protected

Protected thường được dùng khi mà bạn biết chắc là có lớp khác sẽ kế thừa. Lớp này và những phương thức, thuộc tính đó chỉ được dùng trong lớp kế thừa nó.

Giả sử khi các bạn khai báo lớp Động Vật. Trong đó có hàm lưu dữ liệu động vật vào database. Hàm này dùng chung cho tất cả các lớp con kế thừa lớp Động Vật. Và để bảo được mật nên tôi không muốn ở bên ngoài lớp có thể sử dụng được, vì vậy tôi khai báo là protected.

Đó là những ví dụ cơ bản. Nhưng thực tế thì cũng tùy vào từng bài toán cụ thể mà bạn lựa chọn.

5. Khi nào sử dụng cấp độ truy cập public

Public là cấp độ thoáng nhất và nó có thể gọi ở mọi nơi từ trong nội bộ của lớp, đến lớp kế thừa nó. Hay thậm chí cả bên ngoài lớp cũng gọi được.

Những hàm được khai báo public thường hay được dùng để lấy dữ liệu và xuất dữ liệu ra bên ngoài. Hay là những hàm mang tính chất là hàm thao tác cuối cùng với người coder. Ví dụ như là các hàm SET và GET được để ở dạng public.


Hãy tham gia nhóm Học lập trình để thảo luận thêm về các vấn đề cùng quan tâm.