Lập trình hướng đối tượng php
Khi mới làm quen với lập trình chúng ta thường bắt đầu với các ngôn ngữ như Pascal, C là những ngôn ngữ lập trình cấu trúc với việc thực hiện mã lệnh tuần tự kèm theo các câu lệnh điều kiện và các vòng lặp. Kiểu lập trình này giúp chúng ta có thể nhanh chóng tiếp cận và thực hành, nhưng với các dự án dần dà nó có những yếu điểm trong phát triển phần mềm. Từ các các điểm yếu trên chúng ta có "lập trình hướng đối tượng ra đời". Show 1. Lập trình hướng đối tượng là gì?OOP viết tắt của Object-Oriented Programming – Lập trình hướng đối tượng ra đời giải quyết các vấn đề mà lập trình truyền thống gặp phải. Lập trình hướng đối tượng không chỉ đơn giản là các cú pháp, câu lệnh mới mà còn là một cách tư duy mới khi giải quyết một vấn đề. Thực tế khi làm một việc gì đó, chúng ta sẽ quan tâm đến hai điều: vật bị tác động và hành động. Với lập trình cũng vậy, nếu chúng ta tập trung vào hành động thì đó là lập trình hướng thủ tục còn nếu tập trung vào các vật thể thì đó là lập trình hướng đối tượng. Với cả hai cách giải quyết vấn đề, đều cho chúng ta một kết quả như nhau, chỉ có một điều khác nhau là cách chúng ta tập trung vào cái gì? Trong lập trình hướng đối tượng OOP, có hai thuật ngữ rất quan trọng là lớp (class) và đối tượng (object). Class là định nghĩa chung cho một vật, để dễ tưởng tượng bạn có thể nghĩ đến class là một bản thiết kế trong khi đó đối tượng là một thực hiện cụ thể của bản thiết kế. Ví dụ, object là một ngôi nhà cụ thể thì class là bản thiết kế ngôi nhà đó. Lập trình hướng đối tượng là cách bạn thiết kế các class và sau đó thực hiện chúng thành các đối tượng trong chương trình khi cần. Lập trình hướng đối tượng có 4 tính chất chính:
2. Ưu điểm của lập trình hướng đối tượngVì lập trình hướng đối tượng ra đời sau nên nó khắc phục được tất cả các điểm yếu của các phương pháp lập trình trước đó. Cụ thể nó các ưu điểm sau:
3. Một số khái niệm cơ bản trong lập trình hướng đối tượng3.1. Đối tượng (object):
3.2 Lớp (class):
Và để khai báo nó trong PHP thì chúng ta sử dụng cú pháp sau:
Trong đó: Name là tên của class. Nó có các rằng buộc về tên giống như đặt tên hàm trong hướng thủ tục. 3.3 Sự khác nhau giữa đối tượng và lớp:
4. Các tính chất của lập trình hướng đối tượng4.1. Tính trìu tượng (abstraction) Trìu tượng hóa là quá trình đơn giản hóa một đối tượng mà trong đó chỉ bao gồm những đặc điểm quan tâm và bỏ qua những đặc điểm chi tiết nhỏ. Quá trình trừu tượng hóa dữ liệu giúp ta xác định được những thuộc tính, hành động nào của đối tượng cần thiết sử dụng cho chương trình. Để hiểu rõ về tính trìu tượng chúng ta sẽ tìm hiểu về 4.1.1. Abstract class Lớp Đối với lớp này thì nó sẽ có các điểm khác sau:
Và để khai báo một
Trong đó: ClassName là tên của class chúng ta cần khai báo. Cú pháp khai báo một phương thức
Trong đó: Ví dụ 1: khai báo một phương thức abstract trong abstract class
Ví dụ 2: Phải
định nghĩa lại các phương thức
4.1.2. Interface
Để khai báo
Trong đó: InterfaceName là tên của interface các bạn muốn đặt. Tính chất của interface
4.1.3. So sánh giữa Những điểm giống nhau giữa interface và abstract class:
Những điểm khác nhau:
4.2. Tính kế thừa (inheritance) Tính kế thừa trong lập trình hướng đối tượng cho phép một lớp (class) có thể kế thừa các thuộc tính và phương thức từ các lớp khác đã được định nghĩa. Lớp được kế thừa còn được gọi là lớp cha và lớp kế thừa được gọi là lớp con. Điều này cho phép các đối tượng có thể tái sử dụng 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. Trong PHP để khai báo kế thừa từ một lớp cha
chúng ta sử dụng từ khóa
Trong đó: childClass là 4.3. Tính đóng gói (encapsulation) Tính đóng gói là tính chất không cho phép người dùng hay đối tượng khác thay đổi dữ liệu thành viên của đối tượng nội tại. Chỉ có các hàm thành viên của đối tượng đó mới có quyền thay đổi trạng thái nội tại của nó mà thôi. Các đối tượng khác
muốn thay đổi thuộc tính thành viên của đối tượng nội tại, thì chúng cần truyền thông điệp cho đối tượng, và việc quyết định thay đổi hay không vẫn do đối tượng nội tại quyết định. Trong PHP việc đóng gói được thực hiện nhờ sử dụng các từ khoá
4.4. Tính đa hình (polymorphism) Tính đa hình trong lập trình hướng đối tượng là sự đa hình của mỗi hành động cụ thể ở những đối tượng khác nhau. Ví dụ hành động ăn ở các loài động vật hoàn toàn khác nhau như: con heo ăn cám, hổ ăn thịt, con người thì ... ăn hết =)). Đó là sự đa hình trong thực tế, còn đa hình trong lập trình thì được hiểu là Lớp Con sẽ viết lại những phương thức ở lớp cha (ovewrite). Các class cùng 5. Thế nào là một hàm static. Phân biệt cách dùng từ khoá static::method() với self::method()5.1. Static là gì? Static trong lập trình hướng đối tượng là một thành phần tĩnh (có thể là thuộc tính hoặc phương thức) mà nó hoạt động như một biến toàn cục, dù cho nó có được xử lý ở trong bất kỳ một file nào đi nữa (trong cùng một chương trình) thì nó đều lưu lại giá trị cuối cùng mà nó được thực hiện vào trong lớp. Để khai báo một thuộc tính hay một phương thức là
Khi bạn khai báo một thuộc tính hay một phương thức ở dạng Gọi phương thức và thuộc tính tĩnh trong class Để gọi phương thức và thuộc tính tĩnh trong class thì chúng ta có thể sử dụng cú pháp selft::ten hoặc ClassName::ten hoặc static::ten.
Gọi phương thức và thuộc tính tĩnh ngoài class Để gọi phương thức tĩnh ở bên ngoài class thì chúng ta gọi theo cú pháp ClassName::tenPhuongThuc(), ClassName::$tenthuoctinh.
5.2. Phân biệt cách dùng từ khoá static::method() với self::method() Nhìn chung thì cả self và static đều dùng để gọi các thành phần tĩnh trong đối tượng, nhưng nếu chỉ đơn thuần như trong nội bộ class thì cả 2 keywords này đều cho ra kết quả tốt.
Vậy liệu nó có cho ra các giá trị khác nhau khi chúng ta sử dụng tính kế thừa trong class? Để biết rõ hơn thì chúng ta sẽ tạ ra các ví dụ để so sánh nó.
Sau khi chạy dòng trên thì mình thu được kết quả như sau:
Như các bạn đã thấy: Đối với self thì kết quả chạy như bình thường, còn với static thì sao nó lại báo là không thể truy cập vào thuộc tính private mà lại là NguoiLon::$name, phải chăng thằng static này đại diện cho đối tượng hiện tại nên không thể truy xuất được đến thuộc tính $name. Dể chắc ăn hơn thì mình thử đổi visibility của biến $name thành protected xem sao?
Và đây là kết quả mình nhận được:
Giờ đã chạy được ngon lành, nhưng khi nó lại cho ra 2 kết quả khác nhau. Từ 2 ví dụ trên chúng ta tạm đưa ra kết luận là static nó có nguyên tắc gần như $this, là đều truy xuất đến đối tượng hiện tại. Để hiểu hơn nữa thì mình sẽ tiếp tục tạo ra ví dụ sau và chạy nó:
Ok, nó đã chạy được và cho ra kết quả giống với kết luận ở trên. => Kết luận:
Kết luậnTrên đây là một số điều mình tổng hợp được về một số vấn đề về Lập trình hướng đối tượng trong PHP. Trong bài sau, mình sẽ đề cập đến Nguồn tham khảo:
|