a. Khai báo lớp và thể hiện của lớp trong PHP
Như chúng ta đã biết, một lớp bao gồm các kiểu thuộc tính và phương thức.
Trong PHP5, chúng ta khai báo một lớp với cú pháp như sau:
| class tên_lớp { // Danh sách các biến, hằng, lớp... (thuộc tính) // Danh sách các hàm (phương thức) } |
được khai báo dưới dạng các biến, còn các phương thức được xây dựng
dưới dạng các hàm.
Các thuộc tính và các phương thức trong lập
trình hướng đối tượng có thể được thiết lập những tính chất đặc biệt
như : riêng tư (private), công cộng (public)... Các tính chất này
thường được đặt trước các khai báo thuộc tính và phương thức.
Ví dụ đơn giản dưới đây thể hiện một lớp có tên là ho_so với các thuộc tính công cộng bao gồm ho_ten, ngay_sinh:
| class hoso { public $ho_ten; public $ngay_sinh; } |
và $ngay_sinh. Bây giờ chúng ta sẽ khai báo một thể hiện của lớp trên.
Để khai báo một thể hiện của một lớp, ta dùng từ khoá new, tiếp đó là tên lớp:
$ten_thuc_the = new ten_lop;
Để truy cập vào từng thuộc tính hay phương thức của lớp, ta dùng toán tử -> với cú pháp như sau:
$ten_thuc_the-->ten_thuoc_tinh;
Ví dụ sau đây sẽ tạo ra một thực thể của một cá nhân có tên là Hoàng:
| <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </HEAD> <BODY> <? class hoso { public $ho_ten; public $ngay_sinh; } $hoang=new hoso; $hoang->ho_ten="Nguyễn Huy Hoàng"; $hoang->ngay_sinh = "25/7/2003"; echo "Họ tên: " . $hoang->ho_ten . ". Ngày sinh: " . $hoang->ngay_sinh; ?> </BODY> </HTML> |
của các thuộc tính ho_ten và ngay_sinh. Để tham chiếu tới các phần tử
trong chính bản thân lớp đối tượng, chúng ta sử dụng biến $this và toán
tử tham chiếu ->, theo sau đó là tên của phương thức hoặc thuộc tính:
| <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </HEAD> <BODY> <? class hoso { public $ho_ten; public $ngay_sinh; public function lap_gia_tri($hoten,$ngaysinh) { $this->ho_ten = $hoten; $this->ngay_sinh=$ngaysinh; } } $hoang=new hoso; $hoang->lap_gia_tri("Nguyễn Huy Hoàng","25/7/2003"); echo "Họ tên: " . $hoang->ho_ten . ". Ngày sinh: " . $hoang->ngay_sinh; ?> </BODY> </HTML> |
giá trị mặc định ban đầu cho tất cả các thành viên được tạo ra từ lớp
đó. Ví dụ:
| HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </HEAD> <BODY> <? class hoso { public $ho_ten = "Nguyễn Huy Hoàng"; public $ngay_sinh = "25/7/2003"; public function lap_gia_tri($hoten,$ngaysinh) { $this->ho_ten = $hoten; $this->ngay_sinh=$ngaysinh; } } $hoang=new hoso; echo "Họ tên: " . $hoang->ho_ten . ". Ngày sinh: " . $hoang->ngay_sinh; ?> </BODY> </HTML> |
Như chúng ta đã biết, lập trình hướng đối tượng tập trung vào việc “đóng gói” các phương thức và thuộc tính của một đối tượng nào đó.
Trong lập trình hướng đối tượng, các thành viên trong một lớp cần phải được xác định xem chúng có thể được truy xuất từ đâu (tính rõ ràng). Có ba khả năng xảy ra:
- Chế độ truy xuất công cộng (public): Các thành viên nếu được thiết lập ở chế độ này sẽ được nhìn thấy và truy xuất ở mọi nơi trong chương trình.
- Chế độ truy xuất riêng tư (private): Các thành viên nếu được thiết lập ở chế độ này sẽ chỉ được nhìn thấy và truy xuất được ở bản thân lớp định nghĩa thành viên đó.
- Chế độ bảo vệ (protected): Chế độ này sẽ được dùng để giới hạn truy cập tới các lớp được thừa kế và bản thân lớp định nghĩa thành viên đó.
Trong PHP5, tất cả các thành viên của một lớp đều phải được khai báo tính rõ ràng với các từ khoá tương ứng là public, protected và private.
Ví dụ:
| <?php class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; public function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj = new MyClass(); echo $obj->public; // Làm việc tốt echo $obj->protected; // Gây lỗi do thuộc tính $protected đã bị đặt ở chế độ bảo vệ echo $obj->private; // Gây lỗi do thuộc tính $protected đã bị đặt ở chế độ riêng tư $obj->printHello(); // Hoạt động bình thường, do các thuộc tính được triệu gọi bên trong một phương thức nằm trong lớp. class MyClass2 extends MyClass { protected $protected = 'Protected2'; function printHello() { echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj->public; // Chạy tốt echo $obj2->private; // Chưa được định nghĩa echo $obj2->protected; // Gây lỗi $obj2->printHello(); // Hiển thị Public, Protected2, not Private ?> |
Nếu như chúng ta không đặt các từ khoá xác định tính rõ ràng của các thành viên, theo mặc định chúng sẽ ở chế độ public.
Kế thừa lớp trong PHP 5
Ở phần trên, các bạn đã biết đến khái niệm kế thừa giữa các lớp, đó là khả năng một lớp có thể được kế thừa các thành phần dữ liệu cũng như phương thức của một lớp nào đó. Lớp thừa kế những phương thức và thuộc tính của lớp khác được gọi là lớp con, còn lớp được kế thừa được gọi là lớp cha.
Trong PHP, một lớp có thể thừa kế các phương thức cũng như các thuộc tính của một lớp khác bằng cách sử dụng từ khoá extends trong khi khai báo tên lớp.
Ví dụ dưới đây thực hiện việc mở rộng lớp hoso ở trên thêm một số thuộc tính mới bằng cách kế thừa từ lớp hoso:
| <HTML> <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </HEAD> <BODY> <? class hoso { public $ho_ten = "Nguyễn Huy Hoàng"; public $ngay_sinh = "25/7/2003"; public function lap_gia_tri($hoten,$ngaysinh) { $this->ho_ten = $hoten; $this->ngay_sinh=$ngaysinh; } } class hoso2 extends hoso { public $noi_sinh="Thanh Hoá"; public function in_hoso() { echo "Họ tên: " . $this->ho_ten . ". Ngày sinh: " . $this->ngay_sinh . " . Nơi sinh: " . $this->noi_sinh; } } $hoang=new hoso2; $hoang->in_hoso(); ?> </BODY> </HTML> |
Kỹ thuật “nạp chồng” có nghĩa là chúng ta có thể định nghĩa lại các hàm trong lớp cha bằng các hàm cùng tên trong lớp con nhưng hai hàm này có hai chức năng hoàn toàn khác nhau. Nhiều người gọi kỹ thuật này là “đa hình” do chúng tạo ra nhiều hình thái khác nhau ở các lớp thừa kế.
Chúng ta có thể truy cập đến các phương thức hay thành viên đã bị nạp chồng bằng cách tham chiếu chúng với từ khoá parent và toán tử tham chiếu ::, tiếp theo là phương thức hay thành viên cần tham chiếu (parent::ten_phuong_thuc).
Ví dụ dưới đây mô tả cách thức nạp chồng:
| <HEAD> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </HEAD> <BODY> <? class hoso { public $ho_ten = "Nguyễn Huy Hoàng"; public $ngay_sinh = "25/7/2003"; public function in_hoso() { echo "Họ tên:" . $this->ho_ten . ". Ngày sinh: " . $this->ngay_sinh; } } class hoso2 extends hoso { public $noi_sinh="Thanh Hoá"; public function in_hoso() { parent::in_hoso(); echo ". Nơi sinh: " . $this->noi_sinh; } } $hoang=new hoso2; $hoang->in_hoso(); ?> </BODY> </HTML> |
Như các bạn đã thấy, đối tượng $hoang thuộc lớp hoso2 đã được kế thừa mọi thứ ở lớp hoso. Trong lớp hoso2, chúng ta đã định nghĩa một hàm trùng tên với một hàm đã có sẵn trong lớp hoso (hàm in_hoso()). Hàm in_hoso() của lớp hoso2 đã nạp chồng thay thế cho hàm in_hoso() của lớp hoso, nhưng trong bản thân nó lại có thể triệu gọi trực tiếp đến hàm in_hoso() trong lớp cha (hoso).
Nguồn: phpvn
- 16/07/2010 10:10 - Các thao tác kết nối tới MySQL và lựa chọn CSDL bằng PHP
- 13/07/2010 08:49 - Xử lý thư mục và tệp tin
- 13/07/2010 08:47 - Thao tác với Email
- 13/07/2010 08:45 - LDAP (Lightweight Directory Access Protocol)
- 13/07/2010 08:44 - Ứng dụng sockets với php
- 13/07/2010 08:40 - Sử dụng template trong PHP - cơ bản
- 13/07/2010 08:37 - Giới thiệu sơ qua về Classes và Objects
- 13/07/2010 08:35 - Cơ bản về RegExp (Regular Expressions , so mẫu hay biểu thức chính quy) trong PHP
- 12/07/2010 09:33 - Tạo trang login kết hợp với cookies và session
- 10/07/2010 11:15 - Cơ bản về biểu thức chính quy









