Học PHP: Lập trình hướng đối tượng với PHP
Lập trình hướng đối tượng với PHP giúp cho việc lập trình trở nên dễ dàng hơn. Lập trình bây giờ không giống như với ngày trước, tất cả đều hướng về tạo dựng một đối tượng. Xây dựng đối tượng trong PHP làm cho code trở nên rõ ràng, trong sáng và dễ sửa đổi sau này hơn.
Trong PHP, người ta đã cung cấp cho chúng ta sẵn các hàm để định
nghĩa đối tượng, và xây dựng đối tượng khá là đầy đủ. Đễ tiết kiệm chữ
viết và thời gian đọc của các bạn, tôi xin gọi tắt “đôi tượng” ở đây là
“class”.

Đối với lập trình theo hướng thủ tục, tức cách mà ta vẫn thường làm. Xây dựng một hàm, rồi include nó từ một file khác, gọi hàm, … .
Còn sử dụng đối tượng thì sao. Để gọi một hàm mà sử dụng đối tượng thì ít nhất bạn phải tốn 2 dòng code.
Một để tạo mới đối tượng. Và một để gọi hàm. Mình sẽ nói cho bạn nghe
vì sao mà đối tượng tuy dài nhưng lại được ưa chuộng đến thế.

Một class có 3 thứ quan trọng.
Biến $this
Biến $this dùng để ám chỉ đối tượng hiện tại, class mà bạn đang viết code. Việc dùng $this để gọi, hoặc đọc và ghi giá trị vào biến thuộc phạm vi chung của class là bắt buộc. Ví dụ:
Nếu bạn cố ý gọi hamA() mà không dùng $this -> hamA(). Thì PHP sẽ
gọi hamA() bên ngoài class, chứ không gọi hamA() trong class. Hoặc PHP
sẽ báo lỗi.
Đối với biến, nếu bạn cố ý gán bằng lệnh $bien1 = “Hello”; Thì biến cục bộ $bien1 sẽ được tạo bên trong hamB(), và lưu giá trị là “Hello” chứ không lưu vào biến $bien1 ở dòng 2. Nói chung, ta phải dùng “$this ->” để gọi hàm hoặc những biến thuộc về class.
Khác nhau:
Như đã nói ở trên, biến private và protected chỉ dùng được bên trong class. Đó là lý do hàm xuat() có thể dùng được 2 biến này để xuất ra kết quả.
Và không chỉ áp dụng với biến, 3 từ khóa này còn được áp dụng cho hàm với ý nghĩa tương tự. Khác với biến một tí, là khi không để từ khóa này vào thì mặc định hàm sẽ là public. Tức có thể gọi hàm từ bên ngoài class.

Trong php, dùng từ khóa “extends” khi khai báo class để biểu thị là class này đang sử dụng lại một class khác làm cha của nó.
Như đoạn code trên là myNewClass kế thừa myClass.
Trong class con có thể gọi lại các hàm không phải là private của class cha như là một hàm của chính nó. (myClass là class ở đầu bài)
Vậy class con này sẽ có những đặc tính quan trọng?
Class con có thể trực tiếp truy cập biến và gọi hàm của class cha được khai báo với từ khóa “public” hoặc “protected”.
Về lưu trữ, class con là một class lớn hơn class cha. Và chứa luôn cả class cha (xem hình trên).
Việc viết đè rất đơn giản, ta chỉ cần khai báo một hàm với tên y
chang tên hàm của class cha, PHP sẽ tự hiểu bạn đang muốn làm gì. Ví dụ
về viết đè hàm:
Bài viết được viết và trình bày bởi Minh Nhựt (minhnhut.info). Tài liệu tham khảo: PHP.net, phpro.org.
Và bây giờ là thời gian cho câu hỏi …
Hình dung một class
Nếu là người mới lập trình hoặc người đã quen với cách xây dựng hàm và gọi hàm cổ điển. Thì sẽ thấy việc sử dụng class trong lập trình trở nên nhọc nhằng và khó tiếp cận. Mình hiểu vấn đề đó, vì khi lần đầu mình nghe đến định nghĩa class cũng thấy hơi khó chịu. Tuy nhiên mình sẽ làm bạn cảm thấy dễ chịu hơn khi lập trình hướng đối tượng bằng ngôn ngữ PHP qua bài viết này.Điểm khác biệt giữa lập trình hướng đối tượng và lập trình hướng thủ tục (hàm)

Đối với lập trình theo hướng thủ tục, tức cách mà ta vẫn thường làm. Xây dựng một hàm, rồi include nó từ một file khác, gọi hàm, … .
1
| ham_cua_tui(); |
1
2
3
| $obj = new myClass();$obj -> ham_cua_tui(); |
- Thứ nhất, là sử dụng đối tượng làm cho ta cảm thấy gần gũi hơn. Vì từ trước giờ, con người đã quen với việc “tương tác” lên một “đối tượng”. Mọi thứ xung quanh ta đều là đối tượng: chiếc laptop, cái điện thoại, hay cái TV, … tất cả đều là đối tượng. Cũng vì vậy mà người ta cũng làm code trở thành một đối tượng.
- Bạn sẽ cảm thấy được sự quan hệ tương tác qua lại giữa các đối tượng khi lập trình. Chẵn hạng như:
Bạn sẽ cần một thời gian để thấy được sự rời nhau của từng đối tượng trong code, và tưởng tượng ra được sự tương tác của chúng với nhau. Và cũng đừng lo ngại, vì ngày đó sẽ đến sớm.1234
Mảnh đất = new class Mảnh đất;Ngôi nhà = new class Nhà;Mảnh đất -> thêm ( Ngôi nhà ); - Điều cuối cùng làm cho class trở thành một công cụ tuyệt vời khi lập trình. Đó là sự dùng lại của class con với class cha. Làm cho code dễ dàng cải tiến nhanh chóng dựa trên những cái cũ.
3 điều cần quan tâm khi xây dựng một class

Một class có 3 thứ quan trọng.
- Kế thừa – class đang xây dựng có cần phải kế thừa class nào khác để có thể hoạt động hay không
- Thuộc tính – các thuộc tính mà class này cần có, hiểu nôm nà nó là một biến toàn cục dùng chung trong các hàm của class này và bên ngoài trong một số trượng hợp
- Hàm – và phần quan trọng nhất. Bạn có thể hiểu đơn giản, đây là các chức năng mà class cung cấp. Trong đó có một hàm đặc biệt, gọi là hàm xây dựng – construct. Hàm này sẽ được gọi ngay lúc bạn new một class. Thường được dùng để khởi tạo giá trị cho biến.
Kế thừa
Nếu bạn mới nghe nó lần đầu thì, Ok mình sẽ giải thích cho bạn. Kế
thừa ý ám chỉ việc một class con, sử dụng lại các thuộc tính, và hàm của
class cha để hoạt động. Về mặt lưu trữ, thì trong class con sẽ chứa
luôn class cha. Đừng hiểu ngược lại là cha chứa con nhé.
Xây dựng class bằng PHP
Tiến hành tạo một class đơn giản, qua ví dụ bên dưới ta sẽ tạo một class mới tên là myClass:
01
02
03
04
05
06
07
08
09
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
| // Khai báo tên classclass myClass { // Nội dung bên trong class // Các thuộc tính của class private $pri; public $pub; protected $pro; // Hàm của class function __construct() { // Hàm construct $this->pri = "Biến private"; $this->pub = "Biến public"; $this->pro = "Biến protected"; } function xuat() { // Hàm xuất trị echo '$pri: ' . $this->pri; echo '$pub: ' . $this->pub; echo '$pro: ' . $this->pro; }}// Kết thúc một khai báo hàm |
Biến $this dùng để ám chỉ đối tượng hiện tại, class mà bạn đang viết code. Việc dùng $this để gọi, hoặc đọc và ghi giá trị vào biến thuộc phạm vi chung của class là bắt buộc. Ví dụ:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
| class A { private $bien1; function hamA() { echo "Hàm hamA() của class A được gọi"; } function hamB() { // hamB() muốn gọi hàm hamA của class $this -> hamA(); // hamB() muốn đặt giá trị cho biến $bien1 $this -> bien1 = "Hello"; }}// Hết class Afunction hamA() { echo "Hàm hamA() bên ngoài class";} |
Đối với biến, nếu bạn cố ý gán bằng lệnh $bien1 = “Hello”; Thì biến cục bộ $bien1 sẽ được tạo bên trong hamB(), và lưu giá trị là “Hello” chứ không lưu vào biến $bien1 ở dòng 2. Nói chung, ta phải dùng “$this ->” để gọi hàm hoặc những biến thuộc về class.
Lưu ý
Xin nhớ kỹ là khi thao tác với biến: $this -> tenbien. Không phải là $this -> $tenbien.
Xin nhớ kỹ là khi thao tác với biến: $this -> tenbien. Không phải là $this -> $tenbien.
Phân biệt private, public, protected khi lập trình hướng đối tượng với PHP
Điểm chung duy nhất của 3 từ khóa này đều là từ khóa chỉ tầm vực của biến. Hay con gọi là ngữ cảnh, phạm vi mà biến này có thể được truy cập từ.Khác nhau:
- Private: Khắt khe nhất, chỉ trong class khai báo biến này mới có quyền sử dụng.
- Public: Có thể truy cập từ mọi nơi thông qua câu lệnh $obj -> tên_biến;
- Protected: Ít khắt khe hơn Private một chút, ở ngoài class không thể truy cập được biến này. Tuy nhiên class con thì có thể.
1
2
3
4
5
6
7
8
9
| // Sử dụng lại class ở code trên$class = new myClass();echo $class->pub; // Biến publicecho $class->pri; // Lỗi fatalecho $class->pro; // Lỗi fatal$class -> xuat(); // Biến public, Biến private, Biến protected |
Và không chỉ áp dụng với biến, 3 từ khóa này còn được áp dụng cho hàm với ý nghĩa tương tự. Khác với biến một tí, là khi không để từ khóa này vào thì mặc định hàm sẽ là public. Tức có thể gọi hàm từ bên ngoài class.
Class kế thừa
Cách kế thừa khá giống C++. Như giới thiệu ở trên, class con kế thừa class cha sẽ thừa hưởng tất cả các thuộc tính, hàm của class cha. Chúng ta cùng xem lại sơ đồ một class.
Trong php, dùng từ khóa “extends” khi khai báo class để biểu thị là class này đang sử dụng lại một class khác làm cha của nó.
1
2
3
| class myNewClass extends myClass { // code} |
Trong class con có thể gọi lại các hàm không phải là private của class cha như là một hàm của chính nó. (myClass là class ở đầu bài)
1
2
3
4
5
6
7
8
| class myNewClass extends myClass { function xuat2() { echo "Hàm được gọi từ class con"; $this->xuat(); }} |
Class con có thể trực tiếp truy cập biến và gọi hàm của class cha được khai báo với từ khóa “public” hoặc “protected”.
Về lưu trữ, class con là một class lớn hơn class cha. Và chứa luôn cả class cha (xem hình trên).
Viết hàm đè lên hàm cũ của class cha
Khi viết code cho class con, nếu bạn cảm thấy một hàm của class cha không phù hợp, và bạn muốn viết lại hàm này, viết đè lên hàm cũ của class cha.
Việc viết đè hàm này còn gọi là override
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
| class CoBan { function print() { echo "Hàm print() của class CoBan"; }}class KeThua extends CoBan { function print() { echo "Hàm print() của class KeThua"; }}$obj1 = new CoBan();$obj2 = new KeThua();$obj1 -> print(); // Xuất: Hàm print() của class CoBan$obj2 -> print(); // Xuất: Hàm print() của class KeThua |
Gọi lại hàm đã bị viết đè
Ở trên ta vừa tìm hiểu về viết đè hay override hàm của class cha trong PHP. Vậy trường hợp hàm đã bị ghi đè mất rồi thì ta sẽ không gọi được nữa. Làm sao để gọi lại hàm của class cha đây? PHP giải quyết vấn đề này bằng từ khóa parent::.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
| class A { function print() { echo "A"; }}//Class B kế thừa class Aclass B extends A { function print() { parent::print(); // gọi hàm print() của class A echo "B"; }}$obj = new A();$obj -> print(); // Kết quả: A$obj = new B();$obj -> print(); // Kết quả: AB |
Nhận xét
PHP là một ngôn ngữ mạnh và linh hoạt hỗ trợ tốt việc lập trình hướng đối tượng. PHP cung cấp một môi tường vô cùng thuận lợi để chúng ta lập trình hướng đối tượng.Bài viết được viết và trình bày bởi Minh Nhựt (minhnhut.info). Tài liệu tham khảo: PHP.net, phpro.org.
Và bây giờ là thời gian cho câu hỏi …
Không có nhận xét nào:
Đăng nhận xét