Sau khi hoàn thành chương này, chúng ta sẽ có 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.
CHƯƠNG Lập trình hướng đối tượng PHP Các chủ đề Mục tiêu 102 Câu hỏi kiểm tra mở đầu 102 1.Lập trình hướng đối tượng gì? 103 2.Các tính chất lập trình OOP 104 3.Các khái niệm liên quan đến ngôn ngữ lập trình OOP đại 106 4.Lập trình hướng đối tượng PHP 112 4.1 Khai báo lớp thể lớp PHP 112 4.2 Cơ chế đóng kín tính rõ ràng phần tử lớp 116 4.3 Kế thừa lớp PHP 118 5.Tổng kết 121 Câu hỏi trắc ngiệm kết chương 122 Mục tiêu Sau hoàn thành chương này, có thể: Trình bày chất lập trình hướng đối tượng Biết cách khai báo xây dựng lớp, phương thức,thuộc tính đối tượng Trình bày chế đóng kín (ý nghĩa public, private, protected) lập trình hướng đối tượng Biết cách khai báo kế thừa lớp ghi đè (nạp chồng) hàm Câu hỏi kiểm tra mở đầu Trả lời câu hỏi sau: Hàm lập trình hướng đối tượng gọi là? a Thuộc tính b Phương thức c Đối tượng Tính kế thừa có ở? a Lập trình hướng cấu trúc b Lập trình hướng đối tượng c Cả (a) (b) Pascal, VB ngơn ngữ lập trình? a Hướng đối tượng b Hướng cấu trúc Lớp có lập trình hướng đối tượng? a Đúng b Sai Lập trình hướng đối tượng gì? Lập trình hướng đối tượng (gọi tắt 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 xem giúp tăng suất, đơn giản hóa độ phức tạp bảo trì mở rộng phần mềm cách cho phép lập trình viên tập trung vào đối tượng phần mềm bậc cao Ngồi ra, nhiều người cịn cho OOP dễ tiếp thu cho người học lập trình phương pháp trước Một cách giản lược, khái niệm nỗ lực nhằm giảm nhẹ thao tác viết mã cho người lập trình, cho phép họ tạo ứng dụng mà yếu tố bên tương tác với chương trình giống tương tác với đối tượng vật lý Những đối tượng ngôn ngữ OOP kết hợp mã liệu mà chúng nhìn nhận đơn vị Mỗi đối tượng có tên riêng biệt tất tham chiếu đến đối tượng tiến hành qua tên Như vậy, đối tượng có khả nhận vào thông báo, xử lý liệu (bên nó), gửi hay trả lời đến đối tượng khác hay đến môi trường 2 Các tính chất lập trình OOP Lập trình hướng đối tượng phương pháp lập trình có tính chất sau: 2.1 Tính trừu tượng (abstraction) Đây khả chương trình bỏ qua hay khơng ý đến số khía cạnh thơng tin mà trực tiếp làm việc lên, nghĩa có khả tập trung vào cốt lõi cần thiết Mỗi đối tượng phục vụ "động tử" hồn tất công việc cách nội bộ, báo cáo, thay đổi trạng thái liên lạc với đối tượng khác mà không cần cho biết làm cách đối tượng tiến hành thao tác Tính chất thường gọi trừu tượng liệu Tính trừu tượng cịn thể qua việc đối tượng ban đầu có số đặc điểm chung cho nhiều đối tượng khác mở rộng thân đối tượng ban đầu khơng có biện pháp thi hành Tính trừu tượng thường xác định khái niệm gọi lớp trừu tượng hay hay lớp sở trừu tượng 2.2 Tính đóng gói (encapsulation) che dấu thơng tin (information hiding): Tính chất khơng cho phép người sử dụng đối tượng thay đổi trạng thái nội đối tượng Chỉ có phương thức nội đối tượng cho phép thay đổi trạng thái Việc cho phép mơi trường bên tác động lên liệu nội đối tượng theo cách hoàn tồn tùy thuộc vào người viết mã Đây tính chất đảm bảo toàn vẹn đối tượng 2.3 Tính đa hình (polymorphism) Thể thơng qua việc gửi thông điệp (message) Việc gửi thông điệp so sánh việc gọi hàm bên đối tượng Các phương thức dùng trả lời cho thông điệp tùy theo đối tượng mà thơng điệp gửi tới có phản ứng khác Người lập trình định nghĩa đặc tính (chẳng hạn thơng qua tên phương thức) cho loạt đối tượng gần thi hành dùng tên gọi mà thi hành đối tượng tự động xảy tương ứng theo đặc tính đối tượng mà khơng bị nhầm lẫn Thí dụ định nghĩa hai đối tượng "hinh_vuong" "hinh_tron" có phương thức chung "chu_vi" Khi gọi phương thức đối tượng "hinh_vuong" tính theo công thức khác với đối tượng "hinh_tron" 2.4 Tính kế thừa (inheritance) Đặc tính cho phép đối tượng có sẵn đặc tính mà đối tượng khác có thơng qua kế thừa Điều cho phép đối tượng chia sẻ hay mở rộng đặc tính sẵn có mà khơng phải tiến hành định nghĩa lại Tuy nhiên, ngôn ngữ định hướng đối tượng có tính chất 3 Các khái niệm liên quan đến ngôn ngữ lập trình OOP đại 3.1 Lớp (class) Một lớp hiểu kiểu liệu bao gồm thuộc tính phương thức định nghĩa từ trước Đây trừu tượng hóa đối tượng Một đối tượng xác lập thực thể hóa từ lớp Khác với kiểu liệu thông thường, lớp đơn vị (trừu tượng) bao gồm kết hợp phương thức thuộc tính Để có đối tượng (mà xem biến) hoạt động việc thực thể hóa bao gồm việc cài đặt giá trị ban đầu thuộc tính việc đăng kí nhớ, mà công việc thường giao cho phương thức gọi "máy kết cấu" (constructor) hay hàm dựng Ngược lại đối tượng thuộc lớp khơng cịn sử dụng có phương thức để xử lý gọi "máy hủy diệt" (destructor) hay hàm hủy Như vậy, để có đối tượng người lập trình OOP cần phải thiết kế lớp đối tượng cách xây dựng thuộc tính phương thức có đặc tính riêng Mỗi phương thức hay thuộc tính đầy đủ lớp cịn gọi tên thành viên (member) lớp 3.2 Lớp (subclass) Lớp lớp thông thường có thêm tính chất kế thừa phần hay tồn đặc tính lớp khác Lớp mà chia kế thừa gọi lớp phụ mẫu (parent class) 3.3 Lớp trừu tượng hay lớp sở trừu tượng (abstract class) Lớp trừu tượng lớp mà khơng thể thực thể hóa thành đối tượng thực dụng Lớp thiết kế nhằm tạo lớp có đặc tính tổng quát thân lớp chưa có ý nghĩa (hay khơng đủ ý nghĩa) để tiến hành viết mã cho việc thực thể hóa (xem thí dụ) Ví dụ: Lớp "hinh_phang" định nghĩa khơng có liệu nội 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 chưa xác định đầy đủ đặc tính (cụ thể biến nội tọa độ đỉnh đa giác, đường bán kính toạ độ tâm hình trịn, ) nên viết thành lớp trừu tượng Sau đó, người lập trình tạo lớp chẳng hạn lớp "tam_giac", lớp "hinh_tron", lớp "tu_giac", Và lớp người viết mã cung cấp liệu nội (như biến nội r làm bán kính số nội Pi cho lớp "hinh_tron" sau viết mã cụ thể cho phương thức "tinh_chu_vi" "tinh_dien_tich") 3.4 Phương Thức (method) Là hàm nội lớp (hay đối tượng) Tùy theo đặc tính mà người lập trình gán cho, phương pháp gọi bên hàm khác lớp đó, cho phép câu lệnh bên ngồi lớp gọi tới nó, hay cho phép lớp có quan hệ đặc biệt quan hệ lớp con, quan hệ bạn bè (friend) phép gọi tới Mỗi phương pháp có kiểu trả về, chúng trả kiểu liệu cổ điển hay trả kiểu lớp định nghĩa từ trước Một tên gọi khác phương pháp lớp hàm thành viên Người ta định nghĩa thêm vài loại phương pháp đặc biệt: Hàm dựng (constructor) hàm dùng để cài đặt giá tri ban đầu cho biến nội đơi cịn dùng để khai báo việc xử dụng nhớ Hàm hủy (destructor) hàm dùng vào việc làm nhớ hủy bỏ tên đối tượng sau dùng xong, bao gồm việc xóa trỏ nội trả phần nhớ mà đối tượng dùng Trong số trường hợp hàm hủy hay hàm dựng tự động hóa ngơn ngữ OOP trường hợp Visual C++, C# Tiện ích (utility) hàm họat động bên lớp mà khơng cho phép mơi trường bên ngồi gọi tới Các hàm tính toán trung gian nội đối tượng mà xét thấy không cần thiết phải cho giới bên ngồi đối tượng biết 3.5 Thuộc tính (attribute) Thuộc tính lớp bao gồm biến, hằng, hay tham số nội lớp Ở đây, vai trò quan trọng thuộc tính biến chúng bị thay đổi suốt trình hoạt động đối tượng Các thuộc tính xác định kiểu kiểu chúng kiểu liệu cổ điển lớp định nghĩa từ trước Như ghi, lớp thực thể hoá thành đối tượng cụ thể tập họp giá trị biến nội làm thành trạng thái đối tượng Giống trường hợp phương pháp, tùy theo người viết mã, biến nội dùng bên phương pháp lớp đó, cho phép câu lệnh bên lớp, hay cho phép lớp có quan hệ đặc biệt quan hệ lớp con, (và quan hệ bạn bè (friend) C++) phép dùng tới (hay thay đổi giá trị nó) Mỗi thuộc tính lớp gọi thành viên liệu lớp 3.6 Đối tượng (object) Các liệu thị kết hợp vào đơn vị đầy đủ tạo nên đối tượng Đơn vị tương đương với chương trình đối tượng chia thành hai phận chính: phần phương thức (method) phần thuộc tính (property) Trong thực tế, phương thức đối tượng hàm thuộc tính biến, tham số hay nội đối tượng (hay nói cách khác tập hợp liệu nội tạo thành thuộc tính đối tượng) Các phương thức phương tiện để sử dụng đối tượng thuộc tính mơ tả đối tượng có tính chất Các phương thức thuộc tính thường gắn chặt với thực tế đặc tính sử dụng đối tượng Trong thực tế, đối tượng thường trừu tượng hóa qua việc định nghĩa lớp (class) Tập hợp giá trị có thuộc tính tạo nên trạng thái đối tượng Mỗi phương thức hay liệu nội với tính chất định nghĩa (bởi người lập trình) xem đặc tính riêng đối tượng Nếu khơng có lầm lẫn tập hợp đặc tính gọi chung đặc tính đối tượng 3.7 Thực thể (instance) Thực thể hóa (instantiate) trình khai báo để có tên (có thể xem biến) trở thành đối tượng từ lớp Một lớp sau tiến hành thực thể hóa để có đối tượng cụ thể gọi thực thể Hay nói ngược lại thực thể đối tượng riêng lẽ lớp định trước Như biến thông thường, hai thực thể lớp có trạng thái nội khác (xác định giá trị có biến nội tại) hồn tồn độc lập khơng có u cầu đặc biệt từ người lập trình 3.8 Cơng cộng (public) Cơng cộng tính chất dùng để gán cho phương pháp, biến nội tại, hay lớp mà khai báo người lập trình cho phép câu lệnh bên đối tượng khác phép dùng đến Thí dụ: Trong C++ khai báo public: int my_var; biến my_var có hai tính chất tính cơng cộng integer hai tính chất hợp thành đặc tính biến my_var khiến xử dụng hay thay đổi giá trị (bởi câu lệnh) nơi bên lẫn bên lớp 3.9 Riêng tư (private) Riêng tư thể tính chất đóng mạnh (của đặc tính hay lớp) Khi dùng tính chất gán cho biến, phương pháp biến hay phương pháp sử dụng bên lớp mà chúng định nghĩa Mọi nỗ lực dùng đến chúng từ bên qua câu lệnh hay từ lớp bị phủ nhận hay bị lỗi 3.10 Bảo tồn (protected) Tùy theo ngơn ngữ, có vài điểm nhỏ khác cách hiểu tính chất Nhìn chung tính chất mà mà dùng để áp dụng cho phương pháp, biến nội tại, hay lớp có nội lớp hay lớp (hay nội gói Java) phép gọi đến hay dùng đến phương pháp, biến hay lớp So với tính chất riêng tư tính bảo tồn rộng rãi nghĩa chia sẻ liệu hay chức Nó cho phép số trường hợp dùng tới đặc tính lớp (từ lớp chẳng hạn) Lưu ý: Các tính chất cộng cộng, riêng tư bảo tồn đơi cịn dùng để thị cho lớp cách thức kế thừa lớp cha mẹ C++ 3.11 Đa kế thừa (muliple inheritance) Đây tính chất cho phép lớp có khả kế thừa trực tiếp lúc nhiều lớp khác Vài điểm cần lưu ý viết mã dùng tính chất đa kế thừa: Khi muốn có kế thừa từ nhiều lớp phụ mẫu lớp cần phải độc lập đặc biệt tên liệu hay hàm cho phép kế thừa phải có tên khác để tránh lỗi "ambiguilty" Bởi lúc phần mềm chuyển dịch xác định lớp thừa kế tên lớp phụ mẫu Không phải ngôn ngữ OOP loại phân lớp hỗ trợ cho tính chất Ngồi khái niệm trên, tùy theo ngơn ngữ, có chức OOP riêng biệt cấp thêm vào 4 Lập trình hướng đối tượng PHP 4.1 Khai báo lớp thể lớp PHP Như biết, lớp bao gồm kiểu thuộc tính phương thức Trong PHP, khai báo lớp với cú pháp sau: class tên_lớp { // Danh sách biến, hằng, lớp (thuộc tính) // Danh sách hàm (phương thức) } Trong đó, lớp khai báo thơng qua từ khố class, thuộc tính khai báo dạng biến, phương thức xây dựng dạng hàm Các thuộc tính phương thức lập trình hướng đối tượng thiết lập tính chất đặc biệt : riêng tư (private), cơng cộng (public) Các tính chất thường đặt trước khai báo thuộc tính phương thức Ví dụ đơn giản thể lớp có tên ho_so với 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ã khai báo lớp thực thể với hai biến $ho_ten $ngay_sinh Bây khai báo thể lớp Để khai báo thể lớp, ta dùng từ khố new, tiếp tên lớp: $ten_thuc_the = new ten_lop; Để truy cập vào thuộc tính hay phương thức lớp, ta dùng tốn tử → với cú pháp sau: $ten_thuc_the → ten_thuoc_tinh; Ví dụ sau tạo thực thể cá nhân có tên Hồng: Bây giờ, trang bị thêm phương thức để thay đổi giá trị thuộc tính ho_ten ngay_sinh Để tham chiếu tới phần tử thân lớp đối tượng, sử dụng biến $this toán tử tham chiếu →, theo sau tên phương thức thuộc tính: Chú ý khai báo lớp, thiết lập giá trị mặc định ban đầu cho tất thành viên tạo từ lớp Ví dụ: Nếu không đặt từ khố xác định tính rõ ràng thành viên, theo mặc định chúng chế độ public 4.3 Kế thừa lớp PHP Ở phần trên, bạn biết đến khái niệm kế thừa lớp, khả lớp kế thừa thành phần liệu phương thức lớp Lớp thừa kế phương thức thuộc tính lớp khác gọi lớp con, lớp kế thừa gọi lớp cha Trong PHP, lớp thừa kế phương thức thuộc tính lớp khác cách sử dụng từ khố extends khai báo tên lớp Ví dụ thực việc mở rộng lớp hoso thêm số thuộc tính cách kế thừa từ lớp hoso: Các phương thức thành viên thừa kế từ lớp cha sang lớp bị ghi đè lớp cha không định nghĩa chúng dạng phương thức cuối với từ khoá final Kỹ thuật ghi đè cho phép định nghĩa lại hàm lớp cha hàm tên lớp hai hàm có hai chức hoàn toàn khác Nhiều người gọi kỹ thuật “đa hình” chúng tạo nhiều hình thái khác lớp thừa kế Chúng ta truy cập đến phương thức hay thành viên bị ghi đè cách tham chiếu chúng với từ khoá parent toán tử tham chiếu ::, phương thức hay thành viên cần tham chiếu (parent::ten_phuong_thuc) Ví dụ mơ tả cách thức ghi đè: Như thấy, đối tượng $hoang thuộc lớp hoso2 kế thừa thứ lớp hoso Trong lớp hoso2, định nghĩa hàm trùng tên với hàm có sẵn lớp hoso (hàm in_hoso()) Hàm in_hoso() lớp hoso2 ghi đè lên hàm in_hoso() lớp hoso, thân lại triệu gọi trực tiếp đến hàm in_hoso() lớp cha (hoso) 5 Tổng kết Lập trình hướng đối tượng kỹ thuật thường sử dụng công nghệ phần mềm đại lập trình hướng đối tượng (Object Oriented Programming OOP) (Relationships), thuộc sử dụng lớp (classes), tính (Properties) quan hệ phương thức (method) đối tượng (Object) hệ thống để phát triển phần mềm theo cấu trúc kế thừa sử dụng lại mã hiệu Khai báo lớp mọt chức để đóng gói chức ứng dụng Ngoài ra, xây dựng thuộc tính phương thức nhằm sử dụng chung cho toàn ứng dụng hay module sử dụng lại nhiều lần Trong chương này, học cách định nghĩa lớp, lớp kế thừa lớp, cách gọi thuộc tính phương thức lớp PHP Câu hỏi trắc ngiệm kết chương Trả lời câu hỏi sau: Để khai báo lớp PHP sử dụng câu lệnh? a Classes b Creater class c Class d Creater classes Câu lệnh xác để tạo thuộc tính “a” lớp? a $a; b var a; c int a; Câu lệnh xác để khai báo lớp B kế thừa từ lớp A? a Class A extend B b Class A extends class B c Class A extends B d A extend B Các thành viên thiết lập chế độ nhìn thấy truy xuất thân lớp định nghĩa thành viên Chế độ dùng để giới hạn truy cập tới lớp thừa kế thân lớp định nghĩa thành viên ... Đối tượng Tính kế thừa có ở? a Lập trình hướng cấu trúc b Lập trình hướng đối tượng c Cả (a) (b) Pascal, VB ngơn ngữ lập trình? a Hướng đối tượng b Hướng cấu trúc Lớp có lập trình hướng đối tượng? ... Đúng b Sai Lập trình hướng đối tượng gì? Lập trình hướng đối tượng (gọi tắt OOP, từ chữ Anh ngữ object-oriented programming), hay gọi lập trình định hướng đối tượng, kĩ thuật lập trình hỗ trợ... kín tính rõ ràng phần tử lớp Như biết, lập trình hướng đối tượng tập trung vào việc “đóng gói” phương thức thuộc tính đối tượng Trong lập trình hướng đối tượng, thành viên lớp cần phải xác định