Như các bạn đã biết thì Hướng đối tượng có 4 tính chất đặc trưng đó là: kế thừa, đóng gói, trừu tượng, đa hình. Và bài hôm nay chúng ta sẽ cùng đi vào tìm hiểu tính kế thừa trong PHP OOP. -Để cho các bạn dễ hiểu chúng ta cùng nghiên cứu qua ví dụ sau: VD: Giả sử tôi có 2 lớp Người lớn và Trẻ con [nhỏ hơn 1 tuổi] có các properties vào methods như sau:1, Tính kế thừa trong hướng đối tượng.
-Như ở trong hình thì các bạn cũng đã thấy giữa 2 lớp người lớn và trẻ con có các thuộc tính và phương thức khác nhau, và điều đó ứng dụng vào trong lập trình thì chẳng nhẽ chúng ta phải viết cả 2 lớp mà trong nó lại chỉ khác nhau có một chút. Nhưng đối với lập trình hướng đối tượng chúng ta hoàn toàn có thể xây dựng ra một lớp chung cho các lớp con kế thừa nó [điều này trong phương pháp lập trình truyền thống không có] và cụ thể ở đây là lớp con người.
-Một class kế thừa từ class cha của nó sẽ có được đầy đủ các thuộc tính và phương thức của class cha [lưu ý: chỉ là có được các thuộc tính và phương thức chứ sử dụng được hay không là còn do visbility của lớp cha thế nào ].
-Trong PHP để khai báo kế thừa từ một lớp cha chúng ta sử dụng từ khóa extends
theo cú pháp:
class childClass extends parentClass
{
//code
}
Trong đó: childClass là class mà các bạn đang muốn khởi tạo, parentClass là class cha mà childClass đang muốn kế thừa nó.
VD: Giờ đây đối với giả sử ở phần 1 thì chúng ta chỉ cần tìm ra các thuộc tính và phương thức chung để xây dựng lớp cha. Mình sẽ tạo ra lớp ConNguoi là cha của 2 lớp Người lớn và Trẻ con như sau:
class ConNguoi
{
var $chan;
var $tay;
var $mat;
var $mui;
function an[]
{
}
}
-Và giờ 2 lớp con muốn sử kế thừa lại các thuộc tính và phương thức trên thì chỉ cần extends lại. Ở đây mình sẽ kế thừa và phát triển thêm các thuộc tính và phương thức cho 2 class con.
+Lớp Người lớn:
class NguoiLon extends ConNguoi
{
var $longnach;
function di[]
{
}
function noi[]
{
}
}
+Lớp Trẻ con:
class TreCon extensds ConNguoi
{
function bo[]
{
}
}
3, Kế thừa bắc cầu.
-Và đương nhiên trong hướng đối tượng các bạn cũng có thể sử dụng tính chất bắc cầu đối với kế thừa. Khi kế thừa như thế thì class con sẽ kế thừa được tất cả các thuộc tính, phương thức từ lớp cha của nó và lớp cha của lớp cha nó...
VD:
class A
{
//class A
}
class B extends A
{
}
class C extends B
{
//class C
}
4, Gọi thuộc tính và phương thức của lớp cha.
-Đối với cách gọi thuộc
tính và phương thức của class cha thì không khác gì bài trước [xem bài trước]. Nó chỉ khác khi lớp con của chúng ta cũng tồn tại một thuộc tính hay phương thức mà lớp cha của nó đã tồn tại rồi. Trong trường hợp này chúng ta sử dụng từ khóa parent::methodName[]
hoặc parent::propertyName
để xử lý.
VD:
class ParentClass
{
function getClass[]
{
return 'ParentClass';
}
}
class ChildClass extends ParentClass
{
var $name = 'ChildClass';
function getclass[]
{
return 'ChildClass';
}
function getMethod[]
{
echo 'Đây là phương thức ăn của lớp ' . $this->getclass[];
}
function getMethodParent[]
{
echo 'Đây là phương thức ăn của lớp ' . parent::getclass[];
}
}
$class = new ChildClass[];
$class->getMethod[];
//kết quả: Đây là phương thức ăn của lớp Trẻ con
$class->getMethodParent[];
//kết quả: Đây là phương thức ăn của lớp Người lớn
5, Lời kết.
-Như vậy mình đã giới thiệu xong đến mọi người tính kế thừa trong lập trình hướng đối tượng nói chúng và Lập trình PHP nói riêng, mình hy vọng mọi người có thể hiểu được lý thuyết cũng như các ví dụ thực hành của mình. Bài tiếp theo chúng ta sẽ tìm hiểu về các quyền, giới hạn [vibisility] của thuộc tính, phương thức trong lập trình hương đối tượng.
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
Bài Viết Mới
Tính kế thừa là một trong ba tính chất quan trọng của lập trình hướng đối tượng, nó đòi hỏi sự logic về phân tích các đối tượng trong phần mềm để từ đó đưa ra những mô hình design pattern giúp việc nâng cấp, bảo trì phần mềm dễ dàng hơn. Đây là tính chất được coi là quan trọng nhất bởi hầu hết các Framework trong PHP đều có sử dụng tính kế thừa, vì vậy nếu bạn đã xác định theo con đường lập trình PHP thì ắt phải hiểu về kế thừa.
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.
Nội dung bài học như sau:
- Tính kế thừa là gì?
- Gọi phương thức và thuộc tính của lớp cha trong kế thừa
1. Tính kế thừa là gì?
Giả sử tôi có 2 lớp Động Vậtvà lớp Con Trâu có những thuộc tính và phương thức sau:
Nhìn vào hình ta thấy 2 đối tượng Động Vật và Con Trâu có những đặc điểm chung và riêng. đối tượng Con trâu chỉ có một đặc tính khác đó là nó có sừng, còn đối tượng động vật thì không có. Vậy ta có nhận xét như sau: Con trâu cũng là một động vật nên nó có những đặc tính của động vật, hay nói cách khác nó có những đặc điểm và hành động của động vật, vì vậy con trâu có thể kế thừa nhưng đặc điểm và phương thức của động vật.
Bài viết này được đăng tại [free tuts .net]
Đấy là ta đang nói đến tính kế thừa của các đối tượng trong thế giới thực, còn trong lập trình thì như thế nào ?
Nếu khai báo thông thường thì ta sẽ tạo hai class như sau:
Lớp Động Vật:
class DongVat { // Thuộc Tính var $mat = ''; var $mui = ''; var $mieng = ''; var $chan = ''; var $gioitinh = ''; // Hàm, phương thức function an[]{ // lệnh } function ngu[]{ // lệnh } function chay[]{ // lệnh } function lahet[]{ // lệnh } }
Lớp Con Trâu:
class ConTrau { // Thuộc Tính var $mat = ''; var $mui = ''; var $mieng = ''; var $chan = ''; var $gioitinh = ''; // Thuộc tính này khác với động vật var $sung = ''; // con trâu có sừng // Hàm, phương thức function an[]{ // lệnh } function ngu[]{ // lệnh } function chay[]{ // lệnh } function lahet[]{ // lệnh } }
Rõ ràng 2 đối tượng Động Vật và Con Trâu có những thuộc tính và phương thức giống nhau tại sao ta lại phải khai báo 2 đối tượng dài như vậy? Vì thế trong lập trình hướng đối tượng cung cấp chúng ta một tính chất để giải quyết vấn đề này đó là tính kế thừa.
Cú pháp như sau:
class classCon extends classCha { }
Sau khi khai báo như vậy thì classCon
sẽ có tất cả những thuộc tính, phương thức của classCha
nên nó không cần phải viết lại.
Bài toán trên sẽ viết lại dưới dạng kế thừa như sau:
// Lớp Cha class DongVat { // Thuộc Tính var $mat = ''; var $mui = ''; var $mieng = ''; var $chan = ''; var $gioitinh = ''; // Hàm, phương thức function an[]{ // lệnh } function ngu[]{ // lệnh } function chay[]{ // lệnh } function lahet[]{ // lệnh } } // Lớp Con class ConTrau extends DongVat { // Tất cả các thuộc tính khác đều kế thừa từ cha // nên không cần viết lại // chỉ riêng thuộc tính này là cha ko có nên ta phải khai báo var $sung = ''; // Tất cả các hàm, phương thức đều kế thừa từ cha // nên không cần viết lại }
2. Gọi các phương thức và thuộc tính của lớp cha
Sau khi kế thừa thì lớp có sẽ có những thuộc tính và phương thức ở lớp cha, vậy làm thế nào để lớp con có thể truy xuất đến những thuộc tính và phương thức đó? Ta sẽ tìm hiểu thông qua hai cách gọi đó là gọi từ bên trong lớp con và gọi từ bên ngoài lớp.
Gọi bên trong lớp con
Như khái niệm tính kế thừa, lớp con kế thừa từ lớp cha nên tất cả các phương thức và thuộc tính đều coi như là của nó [coi như chứ không phải là của nó hẳn] nên cách gọi cũng như cách nó gọi các phương thức thuộc tính của nó, đó là từ khóa $this->thuoctinh
, $this->phuong_thuc[]
.
Tuy nhiên để phân biệt hàm
nào của cha, hàm nào của con người ta hay gọi bằng từ khóa: parent::thuoctinh
, parent::phuong_thuc[]
.
Ví dụ:
/ Lớp Động Vật class DongVat { // Thuộc tính var $mat = ''; var $mui = ''; // Phương Thức function an[] { echo 'Dong Vat Dang An'; } } // Lớp Con Trâu class ConTrau extends DongVat { function gioi_thieu[] { $this->mat = 'Đây là cái mặt'; $this->mui = 'Đây là cái mũi'; parent::an[]; // xuất ra chuỗi "Động Vật Đang Ăn" } }
Gọi từ bên ngoài lớp
Cách gọi cũng như cách 1 của phần gọi bên trong lớp con, tuy nhiên không được sử dụng cách 2 [parent::thuoctinh
, parent::phuong_thuc[]
].
Ví dụ:
// Lớp Động Vật class DongVat { // Thuộc tính var $mat = ''; var $mui = ''; // Phương Thức function an[] { echo 'Dong Vat Dang An'; } } // Lớp Con Trâu class ConTrau extends DongVat { function gioi_thieu[] { $this->mat = 'Đây là cái mặt'; $this->mui = 'Đây là cái mũi'; parent::an[]; // xuất ra chuỗi "Động Vật Đang Ăn" } } // Chương Trình $contrau = new ConTrau[]; // Gọi đến hàm gioi_thieu trong lớp Con Trâu // nên xuất ra màn hình chuỗi "Động Vật Đang Ăn" $contrau->gioi_thieu[]; // Trong hàm giới thiệu có gán giá trị cho 2 // thuộc tính mắt và mũi, giờ ta xuất ra màn hình // xem giá trị nó là gì echo $contrau->mat; echo $contrau->mui;
3. Lời kết
Trong bài này chúng ta đã tìm hiểu khái niệm tính kế thừa trong lập trình hướng đối tượng và thể hiện tính kế thừa trong php, qua các ví dụ các bạn biết cách gọi thuộc tính và phương thức của đối tượng cha từ bên trong lớp con và bên ngoài lớp con. Bài nay tôi hy vọng các bạn nắm vững phần lý thuyết cũng như thực hành để qua các bài sau sẽ hiểu được bài hơn. Bài tiếp theo chúng ta sẽ học các mức truy cập trong lập trình hướng đối tượng php.