Giáo trình Lập trình PHP cơ bản - Chương 4: Lập trình hướng đối tượng trong PHP

Mục tiêu  
Sau khi hoàn thành chương này, chúng ta sẽ thể:  
Trình bày được bản chất của lập trình hướng đối tượng.  
Biết cách khai báo và xây dựng các lớp, phương thức,thuộc tính và  
đối tượng.  
Trình bày được cơ chế đóng kín (ý nghĩa của public, private,  
protected) trong lập trình hướng đối tượng.  
Biết cách khai báo kế thừa lớp cũng như ghi đè (nạp chồng) hàm.  
Câu hỏi kiểm tra mở đầu  
Trả lời các câu hỏi sau:  
1. Hàm trong lập trình hướng đối tượng được gọi là?  
a. Thuộc tính  
b. Phương thức  
c. Đối tượng  
2. Tính kế thừa ở?  
a. Lập trình hướng cấu trúc  
b. Lập trình hướng đối tượng  
c. Cả (a) và (b)  
3. Pascal, VB là ngôn ngữ lập trình?  
a. Hướng đối tượng  
b. Hướng cấu trúc  
4. Lớp chỉ có duy nhất trong lập trình hướng đối tượng?  
a. Đúng  
b. Sai  
   
1.Lập trình hướng đối tượng là gì?  
Lập trình hướng đối tượng (gọi tắt là OOP, từ chữ Anh ngữ  
object-oriented programming), hay còn gọi lập trình định  
hướng đối tượng, kĩ thuật lập trình hỗ trợ công nghệ đối tượng. OOP  
được xem là giúp tăng năng suất, đơn giản hóa độ phức tạp khi bảo trì  
cũng như mở rộng phần mềm bằng cách cho phép lập trình viên tập trung  
vào các đối tượng phần mềm ở bậc cao hơn. Ngoài ra, nhiều người còn  
cho rằng OOP dễ tiếp thu hơn cho những người mới học về lập trình hơn  
là các phương pháp trước đó.  
Một cách giản lược, đây là khái niệm và là một nỗ lực nhằm giảm  
nhẹ các thao tác viết mã cho người lập trình, cho phép họ tạo ra các ứng  
dụng mà các yếu tố bên ngoài có thể tương tác với các chương trình đó  
giống như tương tác với các đối tượng vật lý.  
Những đối tượng trong một ngôn ngữ OOP là các kết hợp giữa mã  
dữ liệu mà chúng được nhìn nhận như một đơn vị duy nhất. Mỗi đối  
tượng một tên riêng biệt tất cả các tham chiếu đến đối tượng đó  
được tiến hành qua tên của nó. Như vậy, mỗi đối tượng khả năng nhận  
vào các thông báo, xử dữ liệu (bên trong của nó), và gửi ra hay trả lời  
đến các đối tượng khác hay đến môi trường.  
 
2.Các tính chất cơ bản của lập trình OOP  
Lập trình hướng đối tượng một phương pháp lập trình có các tính chất  
chính sau:  
2.1 Tính trừu tượng (abstraction)  
Đây khả năng của chương trình bỏ qua hay không chú ý đến một  
số khía cạnh của thông tin mà nó đang trực tiếp làm việc lên, nghĩa là nó có  
khả năng tập trung vào những cốt lõi cần thiết. Mỗi đối tượng phục vụ như  
một "động tử" thể hoàn tất các công việc một cách nội bộ, báo cáo,  
thay đổi trạng thái của nó và liên lạc với các đối tượng khác mà không cần  
cho biết làm cách nào đối tượng tiến hành được các thao tác. Tính chất này  
thường được gọi sự trừu tượng của dữ liệu.  
Tính trừu tượng còn thể hiện qua việc một đối tượng ban đầu thể  
một số đặc điểm chung cho nhiều đối tượng khác như sự mở rộng của  
nhưng bản thân đối tượng ban đầu này có thể không có các biện pháp thi  
hành. Tính trừu tượng này thường được xác định trong khái niệm gọi lớp  
trừu tượng hay hay lớp cơ sở trừu tượng.  
2.2 Tính đóng gói (encapsulation) và che dấu thông tin  
(information hiding):  
Tính chất này không cho phép người sử dụng các đối tượng thay đổi  
trạng thái nội tại của một đối tượng. Chỉ có các phương thức nội tại của đối  
tượng cho phép thay đổi trạng thái của nó. Việc cho phép môi trường bên  
ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là  
hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn  
của đối tượng.  
 
2.3 Tính đa hình (polymorphism)  
Thể hiện thông qua việc gửi các thông điệp (message). Việc gửi các  
thông điệp này có thể so sánh như việc gọi các hàm bên trong của một đối  
tượng. Các phương thức dùng trả lời cho một thông điệp sẽ tùy theo đối  
tượng mà thông điệp đó được gửi tới sẽ phản ứng khác nhau. Người lập  
trình có thể định nghĩa một đặc tính (chẳng hạn thông qua tên của các  
phương thức) cho một loạt các đối tượng gần nhau nhưng khi thi hành thì  
dùng cùng một tên gọi sự thi hành của mỗi đối tượng sẽ tự động xảy ra  
tương ứng theo đặc tính của từng đối tượng mà không bị nhầm lẫn.  
Thí dụ khi định nghĩa hai đối tượng "hinh_vuong" và "hinh_tron" thì  
một phương thức chung là "chu_vi".Khi gọi phương thức này thì nếu  
đối tượng "hinh_vuong" sẽ tính theo công thức khác với khi đối  
tượng "hinh_tron".  
2.4 Tính kế thừa (inheritance)  
Đặc tính này cho phép một đối tượng thể sẵn các đặc tính mà  
đối tượng khác đã có thông qua kế thừa. Điều này cho phép các đối tượng  
chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa  
lại. Tuy nhiên, không phải ngôn ngữ định hướng đối tượng nào cũng có tính  
chất này.  
3.Các khái niệm liên quan đến các ngôn ngữ  
lập trình OOP hiện đại  
3.1 Lớp (class)  
Một lớp được hiểu một kiểu dữ liệu bao gồm các thuộc tính và các  
phương thức được định nghĩa từ trước. Đây sự trừu tượng hóa của đối  
tượng. Một đối tượng sẽ được xác lập khi nó được thực thể hóa từ một lớp.  
Khác với kiểu dữ liệu thông thường, một lớp một đơn vị (trừu tượng) bao  
gồm sự kết hợp giữa các phương thức và các thuộc tính. Để một đối  
tượng (mà có thể được xem như một biến) hoạt động được thì việc thực  
thể hóa sẽ thể bao gồm việc cài đặt các giá trị ban đầu của các thuộc tính  
cũng như việc đăng bộ nhớ, mà công việc này thường được giao cho các  
phương thức gọi là "máy kết cấu" (constructor) hay hàm dựng. Ngược lại  
khi một đối tượng thuộc về một lớp không còn sử dụng nữa thì cũng thể  
một phương thức để xử gọi là "máy hủy diệt" (destructor) hay hàm  
hủy.  
Như vậy, để được các đối tượng thì người lập trình OOP cần phải  
thiết kế lớp của các đối tượng đó bằng cách xây dựng các thuộc tính và các  
phương thức có các đặc tính riêng.  
Mỗi một phương thức hay một thuộc tính đầy đủ của một lớp còn  
được gọi tên là một thành viên (member) của lớp đó.  
3.2 Lớp con (subclass)  
Lớp con là một lớp thông thường nhưng có thêm tính chất kế thừa một  
phần hay toàn bộ các đặc tính của một lớp khác. Lớp mà chia sẽ sự kế thừa  
gọi lớp phụ mẫu (parent class).  
 
3.3 Lớp trừu tượng hay lớp cơ sở trừu tượng (abstract  
class)  
Lớp trừu tượng một lớp mà nó không thể thực thể hóa thành một  
đối tượng thực dụng được. Lớp này được thiết kế nhằm tạo ra một lớp có các  
đặc tính tổng quát nhưng bản thân lớp đó chưa có ý nghĩa (hay không đủ ý  
nghĩa) để thể tiến hành viết mã cho việc thực thể hóa. (xem thí dụ)  
dụ: Lớp "hinh_phang"được định nghĩa không có dữ liệu nội  
tại chỉ có các phương thức (hàm nội tại) "tinh_chu_vi",  
"tinh_dien_tich". Nhưng lớp hình_phẳng này chưa xác định  
được đầy đủ các đặc tính của (cụ thể các biến nội tại tọa độ các đỉnh  
nếu đa giác, là đường bán kính và toạ độ tâm nếu là hình tròn, ...) nên nó  
chỉ thể được viết thành một lớp trừu tượng. Sau đó, người lập trình có thể  
tạo ra các lớp con chẳng hạn như lớp "tam_giac", lớp  
"hinh_tron",lớp "tu_giac",....Và trong các lớp con này người  
viết sẽ cung cấp các dữ liệu nội tại (như biến nội tại r làm bán kính và  
hằng số nội tại Pi cho lớp "hinh_tron"và sau đó viết cụ thể cho các  
phương thức "tinh_chu_vi" và "tinh_dien_tich").  
3.4 Phương Thức (method)  
Là hàm nội tại của một lớp (hay một đối tượng). Tùy theo đặc tính mà  
người lập trình gán cho, một phương pháp có thể chỉ được gọi bên trong các  
hàm khác của lớp đó, thể cho phép các câu lệnh bên ngoài lớp gọi tới nó,  
hay chỉ cho phép các lớp có quan hệ đặc biệt như là quan hệ lớp con, và  
quan hệ bạn bè (friend) được phép gọi tới nó. Mỗi phương pháp đều thể  
kiểu trả về, chúng có thể trả các kiểu dữ liệu cổ điển hay trả về một kiểu  
một lớp đã được định nghĩa từ trước. Một tên gọi khác của phương pháp  
của một lớp là hàm thành viên.  
Người ta còn định nghĩa thêm vài loại phương pháp đặc biệt:  
Hàm dựng (constructor) là hàm được dùng để cài đặt các giá tri ban  
đầu cho các biến nội tại đôi khi còn dùng để khai báo về việc xử dụng bộ  
nhớ.  
Hàm hủy (destructor) là hàm dùng vào việc làm sạch bộ nhớ hủy  
bỏ tên của một đối tượng sau khi đã dùng xong, trong đó thể bao gồm cả  
việc xóa các con trỏ nội tại trả về các phần bộ nhđối tượng đã dùng.  
Trong một số trường hợp thì hàm hủy hay hàm dựng thể được tự động  
hóa bởi ngôn ngữ OOP như trường hợp của Visual C++, C#.  
Tiện ích (utility) là các hàm chỉ họat động bên trong của một lớp mà  
không cho phép môi trường bên ngoài gọi tới. Các hàm này có thể những  
tính toán trung gian nội bộ của một đối tượng mà xét thấy không cần thiết  
phải cho thế giới bên ngoài của đối tượng biết là gì.  
3.5 Thuộc tính (attribute)  
Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội  
tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến  
vì chúng sẽ thể bị thay đổi trong suốt quá trình hoạt động của một đối  
tượng. Các thuộc tính có thể được xác định kiểu kiểu của chúng có thể là  
các kiểu dữ liệu cổ điển hay đó một lớp đã định nghĩa từ trước. Như đã  
ghi, khi một lớp đã được thực thể hoá thành đối tượng cụ thể thì tập họp các  
giá trị của các biến nội tại làm thành trạng thái của đối tượng. Giống như  
trường hợp của phương pháp, tùy theo người viết mã, biến nội tại thể chỉ  
được dùng bên trong các phương pháp của chính lớp đó, thể cho phép các  
câu lệnh bên ngoài lớp, hay chỉ cho phép các lớp có quan hệ đặc biệt như là  
quan hệ lớp con, (và quan hệ bạn bè (friend) trong C++) được phép dùng tới  
nó (hay thay đổi giá trị của nó). Mỗi thuộc tính của một lớp còn được gọi là  
thành viên dữ liệu của lớp đó.  
3.6 Đối tượng (object)  
Các dữ liệu chỉ thị được kết hợp vào một đơn vị đầy đủ tạo nên  
một đối tượng. Đơn vị này tương đương với một chương trình con và vì thế  
các đối tượng sẽ được chia thành hai bộ phận chính: phần các phương thức  
(method) và phần các thuộc tính (property). Trong thực tế, các phương thức  
của đối tượng là các hàm và các thuộc tính của nó là các biến, các tham số  
hay hằng nội tại của một đối tượng (hay nói cách khác tập hợp các dữ liệu  
nội tại tạo thành thuộc tính của đối tượng). Các phương thức phương tiện  
để sử dụng một đối tượng trong khi các thuộc tính sẽ tả đối tượng có  
những tính chất gì.  
Các phương thức và các thuộc tính thường gắn chặt với thực tế các  
đặc tính và sử dụng của một đối tượng.  
Trong thực tế, các đối tượng thường được trừu tượng hóa qua việc  
định nghĩa của các lớp (class).  
Tập hợp các giá trị hiện của các thuộc tính tạo nên trạng thái của  
một đối tượng.  
Mỗi phương thức hay mỗi dữ liệu nội tại cùng với các tính chất được  
định nghĩa (bởi người lập trình) được xem là một đặc tính riêng của đối  
tượng. Nếu không có gì lầm lẫn thì tập hợp các đặc tính này gọi chung là đặc  
tính của đối tượng.  
3.7 Thực thể (instance)  
Thực thể hóa (instantiate) là quá trình khai báo để một tên (có thể  
được xem như một biến) trở thành một đối tượng từ một lớp nào đó.  
Một lớp sau khi được tiến hành thực thể hóa để một đối tượng cụ  
thể gọi một thực thể. Hay nói ngược lại một thực thể một đối tượng  
riêng lẽ của một lớp đã định trước. Như các biến thông thường, hai thực thể  
của cùng một lớp thể trạng thái nội tại khác nhau (xác định bởi các giá  
trị hiện của các biến nội tại) và do đó hoàn toàn độc lập nhau nếu không  
có yêu cầu đặc biệt từ người lập trình.  
3.8 Công cộng (public)  
Công cộng một tính chất được dùng để gán cho các phương pháp,  
các biến nội tại, hay các lớp mà khi khai báo thì người lập trình đã cho phép  
các câu lệnh bên ngoài cũng như các đối tượng khác được phép dùng đến nó.  
Thí dụ: Trong C++ khai báo public: int my_var; thì biến  
my_varcó hai tính chất là tính công cộng và là một integercả hai tính  
chất này hợp thành đặc tính của biến my_varkhiến nó có thể được xử dụng  
hay thay đổi giá trị của (bởi các câu lệnh) ở mọi nơi bên ngoài lẫn bên  
trong của lớp.  
3.9 Riêng (private)  
Riêng sự thể hiện tính chất đóng mạnh nhất (của một đặc tính  
hay một lớp). Khi dùng tính chất này gán cho một biến, một phương pháp thì  
biến hay phương pháp đó chỉ thể được sử dụng bên trong của lớp mà  
chúng được định nghĩa. Mọi nỗ lực dùng đến chúng từ bên ngoài qua các  
câu lệnh hay từ các lớp con sẽ bị phủ nhận hay bị lỗi.  
3.10 Bảo tồn (protected)  
Tùy theo ngôn ngữ, sẽ có vài điểm nhỏ khác nhau về cách hiểu tính  
chất này. Nhìn chung đây là tính chất mà mà khi dùng để áp dụng cho các  
phương pháp, các biến nội tại, hay các lớp thì chỉ có trong nội bộ của lớp đó  
hay các lớp con của nó (hay trong nội bộ một gói như trong Java) được phép  
gọi đến hay dùng đến các phương pháp, biến hay lớp đó.  
So với tính chất riêng thì tính bảo tồn rộng rãi hơn về nghĩa chia sẻ  
dữ liệu hay chức năng. Nó cho phép một số trường hợp được dùng tới các  
đặc tính của một lớp (từ một lớp con chẳng hạn).  
Lưu ý: Các tính chất cộng cộng, riêng bảo tồn đôi khi còn được  
dùng để chỉ thcho một lớp con cách thức kế thừa một lớp cha mẹ như trong  
C++.  
3.11 Đa kế thừa (muliple inheritance)  
Đây một tính chất cho phép một lớp con có khả năng kế thừa trực  
tiếp cùng lúc nhiều lớp khác.  
Vài điểm cần lưu ý khi viết mã dùng tính chất đa kế thừa:  
Khi muốn một sự kế thừa từ nhiều lớp phụ mẫu thì các lớp này cần  
phải độc lập đặc biệt tên của các dữ liệu hay hàm cho phép kế thừa phải  
có tên khác nhau để tránh lỗi "ambiguilty". Bởi vì lúc đó phần mềm chuyển  
dịch sẽ không thể xác định được lớp con sẽ thừa kế tên nào của các lớp  
phụ mẫu.  
Không phải ngôn ngữ OOP loại phân lớp nào cũng hỗ trợ cho tính  
chất này.  
Ngoài các khái niệm trên, tùy theo ngôn ngữ, thể sẽ có các chức  
năng OOP riêng biệt được cấp thêm vào.  
4.Lập trình hướng đối tượng trong PHP  
4.1 Khai báo lớp 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 PHP, 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)  
}
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 (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.  
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;  
}
   
Đ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$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;  
dụ sau đây sẽ tạo ra một thực thể của một cá nhân có tên Hoàng:  
<HTML>  
<BODY>  
<?phpphp  
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_tenngay_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 $thisvà 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>  
<?php  
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 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ụ:  
<HTML>  
<HEAD>  
<meta http-equiv="Content-Type"  
content="text/html; charset=UTF-8" />  
</HEAD>  
<BODY>  
<?php  
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;  
4.2 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 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 (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ế bản thân lớp định nghĩa thành  
viên đó.  
Trong PHP, 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 public, protected và  
private.  
dụ:  
<?phpphp  
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, không 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.  
4.3 Kế thừa lớp trong PHP  
Ở 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 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 thuộc  
tính của lớp khác được gọi lớp con, còn lớp được kế thừa được gọi lớp  
cha.  
Trong PHP, một lớp 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á extendstrong khi  
khai báo tên lớp.  
dụ dưới đây thực hiện việc mở rộng lớp hosotrê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>  
<?php  
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ị ghi đè 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 ghi đè cho phép 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ị  
ghi đè 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).  
dụ dưới đây tả cách thức ghi đè:  
<BODY>  
<?php  
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ư chúng ta đã thấy, đối tượng $hoangthuộ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 đã sẵn trong lớp hoso(hàm in_hoso()).  
Hàm in_hoso()của lớp hoso2đã ghi đè lên hàm in_hoso()của lớp  
hoso, nhưng trong bản thân nó lại thể triệu gọi trực tiếp đến hàm  
in_hoso()trong lớp cha (hoso).  
Tải về để xem bản đầy đủ
doc 22 trang Thùy Anh 05/05/2022 3980
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình PHP cơ bản - Chương 4: Lập trình hướng đối tượng trong PHP", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • docgiao_trinh_lap_trinh_php_co_ban_chuong_4_lap_trinh_huong_doi.doc