Thứ Hai, 4 tháng 1, 2010

Lập trình hướng đối tượng trong PHP 5

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:

Quote:

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)
}

Trong đó, các lớp được khai báo thông qua từ khoá class, các thuộc tính
đượ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:

Quote:

class hoso
{
public $ho_ten;
public $ngay_sinh;
}

Đoạn mã trên mới chỉ khai báo một lớp thực thể với hai biến là $ho_ten
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:

Quote:

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

Bây giờ, chúng ta sẽ trang bị thêm một phương thức để thay đổi giá trị
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:

Quote:

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

Chú ý rằng khi khai báo một lớp, chúng ta cũng có thể thiết lập những
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ụ:

Quote:

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>

Cơ chế đóng kín và tính rõ ràng của các phần tử trong lớp
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ụ:

Quote:

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

Quote:

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

Các phương thức và thành viên thừa kế từ lớp cha sang lớp con có thể bị nạp chồng (thay đổi) nếu như lớp cha không định nghĩa chúng dưới dạng các phương thức cuối cùng với từ khoá final.
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:

Quote:

<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.org 

Không có nhận xét nào: