Khi mới bắt đầu học lập trình, chúng ta thường tiếp cận với các ngôn ngữ như Pascal, C, những ngôn ngữ lập trình cấu trúc, sử dụng các câu lệnh tuần tự, điều kiện và vòng lặp. Phương pháp này giúp chúng ta nhanh chóng nắm bắt và thực hành, nhưng nó có nhược điểm trong quá trình phát triển phần mềm. Từ những yếu điểm đó, “lập trình hướng đối tượng” ra đời.
Contents
Lập trình hướng đối tượng (OOP) giải quyết các vấn đề mà lập trình truyền thống gặp phải. Nó không chỉ là về cú pháp và câu lệnh mới, mà còn mang đến một cách tư duy mới khi giải quyết vấn đề. Thực tế, khi làm một công việc gì đó, chúng ta quan tâm đến hai điều: vật bị tác động và hành động. Trong lập trình cũng vậy, nếu chúng ta tập trung vào hành động, đó là lập trình hướng thủ tục, còn nếu tập trung vào các vật thể, đó là lập trình hướng đối tượng. Dù bạn chọn phương pháp nào, kết quả cuối cùng đều giống nhau, chỉ khác nhau ở mức độ tập trung vào điều gì.
Trong lập trình hướng đối tượng (OOP), có hai thuật ngữ quan trọng là lớp (class) và đối tượng (object). Lớp là định nghĩa chung cho một vật, tương tự như một bản thiết kế, còn đối tượng là một thực hiện cụ thể của bản thiết kế đó. Ví dụ, ngôi nhà cụ thể là một đối tượng, trong khi bản thiết kế của ngôi nhà đó chính là lớp. Lập trình hướng đối tượng là quá trình thiết kế các lớp và sau đó sử dụng chúng để tạo ra các đối tượng trong chương trình khi cần thiết.
Lập trình hướng đối tượng có 4 tính chất chính:
Lập trình hướng đối tượng ra đời để khắc phục các hạn chế của các phương pháp lập trình trước đó. Có một số ưu điểm nổi bật sau:
Để khai báo một lớp trong PHP, ta sử dụng cú pháp sau:
class TenLop {
// code
}
Trong đó, TenLop
là tên của lớp.
Để khai báo một abstract class trong PHP, ta sử dụng cú pháp sau:
abstract class TenLop {
// code
}
Trong đó, TenLop
là tên của lớp cần khai báo.
Cú pháp khai báo một phương thức abstract:
abstract visibility function tenPhuongThuc();
Trong đó, visibility
là một trong 2 từ khóa public, protected hoặc có thể bỏ trống (bỏ trống là public), tenPhuongThuc
là tên của phương thức cần khai báo.
Để khai báo một interface trong PHP, ta sử dụng cú pháp sau:
interface TenInterface {
// code
}
Trong đó, TenInterface
là tên của interface.
Interface có một số tính chất sau:
Những điểm khác nhau giữa interface và abstract class:
| Interface | Abstract class |
| — | — |
| Chỉ có thể kế thừa nhiều interface khác. | Có thể kế thừa từ 1 lớp và nhiều interface. |
| Chỉ chứa các khai báo và không có phần nội dung. | Có thể chứa các thuộc tính thường và các phương thức bình thường bên trong. |
| Không có constructor và destructor. | Có constructor và destructor. |
| Phạm vi truy cập mặc định là public. | Có thể xác định modifier. |
| Dùng để định nghĩa một khuôn mẫu hoặc quy tắc chung. | Dùng để định nghĩa cốt lõi của lớp, thành phần chung của lớp và sử dụng cho nhiều đối tượng cùng kiểu. |
| Tương đối chậm hơn vì cần thời gian tìm phương thức tương ứng với lớp. | Tương đối nhanh hơn. |
| Khi thêm mới một khai báo, phải tìm hết tất cả các lớp có thực thi interface này để định nghĩa nội dung cho phương thức mới. | Đối với abstract class, khi định nghĩa một phương thức mới, hoàn toàn có thể định nghĩa nội dung phương thức là rỗng hoặc một tác động mặc định nào đó. Vì thế, toàn bộ hệ thống vẫn chạy bình thường.
Để khai báo kế thừa từ một lớp cha trong PHP, ta sử dụng từ khóa extends theo cú pháp sau:
class ClassName extends ParentClass {
// code
}
Trong đó, ClassName
là tên của lớp con, ParentClass
là tên của lớp cha cần kế thừa.
Tính đa hình trong lập trình hướng đối tượng là sự đa dạng 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 khác nhau hoàn toàn khác nhau như: con heo ăn cám, hổ ăn thịt, con người thì ăn hết.
Đa hình trong lập trình có nghĩa là lớp con có thể viết lại những phương thức có trong lớp cha (overwrite).
Các class cùng implement một interface nhưng có cách thức thực hiện khác nhau cho các method của interface đó.
Để khai báo một thuộc tính hoặc một phương thức là static trong PHP, ta sử dụng cú pháp sau:
class ClassName {
// code
visibility static $propertyName;
visibility static function methodName() {
// code
}
}
Trong đó, visibility
là từ khóa public, protected hoặc có thể bỏ trống (bỏ trống sẽ mặc định là public).
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 là trong nội bộ class, cả hai từ khóa này đều cho kết quả tốt.class ConNguoi {
private static $name = 'ConNguoi';
public static function getName() {
echo self::$name;
echo '<br>';
echo static::$name;
}
}
ConNguoi::getName(); // ConNguoi // ConNguoi
Vậy liệu có cho ra các giá trị khác nhau khi sử dụng tính kế thừa trong class? Để biết rõ hơn, ta thử tạo ví dụ sau và chạy:
class ConNguoi {
private static $name = 'ConNguoi';
public static function getSelf() {
return new self();
}
public static function getStatic() {
return new static();
}
}
class NguoiLon extends ConNguoi {
}
echo get_class(NguoiLon::getSelf()); // ConNguoi
echo get_class(NguoiLon::getStatic()); // NguoiLon
Kết quả:
Trên đây là một số điều mình tổng hợp được về Lập trình hướng đối tượng trong PHP. Trong bài tiếp theo, mình sẽ đề cập đến Trait, Namespaces, magic functions và các quy tắc trong PSR-2. Hy vọng các bạn đã hiểu và thấy hứng thú với lập trình theo hướng đối tượng!
This post was last modified on Tháng Năm 8, 2024 6:58 sáng
Khám phá và tận dụng tiềm năng kinh doanh trên nhiều nền tảng là điều…
Mobile App đang trở thành một phần thiết yếu trong cuộc sống hiện đại. Với…
Bạn đã bao giờ quên mật khẩu máy tính và không biết phải làm sao?…
Driver chính là phần mềm giúp hệ điều hành nhận diện phần cứng trên máy…
Hiện nay, lập trình viên không cần phải thực hiện toàn bộ công việc lập…
Lập trình ứng dụng cho iOS không chỉ đơn thuần là một quyết định khó…