Lập trình hướng đối tượng (OOP) trong PHP – Phần 1

Published by

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.

1. Lập trình hướng đối tượng là gì?

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:

  • Tính trừu tượng (abstraction).
  • Tính kế thừa (inheritance).
  • Tính đóng gói (encapsulation).
  • Tính đa hình (polymorphism).

2. Ưu điểm của lập trình hướng đối tượng

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:

  • Dễ quản lý mã khi có sự thay đổi trong chương trình.
  • Dễ mở rộng dự án.
  • Tiết kiệm tài nguyên hệ thống.
  • Bảo mật cao.
  • Tái sử dụng cao.

3. Một số khái niệm cơ bản trong lập trình hướng đối tượng

3.1. Đối tượng (object):

  • Trong lập trình hướng đối tượng, đối tượng được hiểu như là một thực thể, có thể là người, vật hoặc một bảng dữ liệu.
  • Một đối tượng bao gồm hai thông tin: thuộc tính và phương thức.
  • Thuộc tính là những thông tin, đặc điểm của đối tượng, ví dụ: người có họ tên, ngày sinh, màu da, kiểu tóc, …
  • Phương thức là những thao tác, hành động mà đối tượng có thể thực hiện, ví dụ: người có thể nói, đi, ăn, uống, …

3.2 Lớp (class):

  • Các đối tượng có các đặc tính tương tự nhau được gom lại thành một lớp đối tượng.
  • Bên trong lớp cũng có hai thành phần chính là thuộc tính và phương thức.
  • Lớp cũng được dùng để định nghĩa kiểu dữ liệu mới.

Để 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.

3.3 Sự khác nhau giữa đối tượng và lớp:

  • Lớp là một khuôn mẫu, còn đối tượng là một thể hiện cụ thể dựa trên khuôn mẫu đó.
  • Đối tượng chính là một con mèo cụ thể nào đó.

4. Các tính chất của lập trình hướng đối tượng

4.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, chỉ giữ lại những đặc điểm quan trọng và bỏ qua những đặc điểm chi tiết nhỏ.
  • Quá trình này giúp xác định những thuộc tính và hành động cần thiết của đối tượng cho chương trình.
  • Trong PHP, chúng ta sử dụng Abstract class và Interface để hiểu rõ hơn về tính trừu tượng.

4.1.1. Abstract class

  • Lớp Abstract định nghĩa các phương thức mà các lớp con sẽ kế thừa và ghi đè.
  • Abstract class có một số điểm khác biệt:
    • Các phương thức khi khai báo là abstract chỉ được định nghĩa mà không được viết code xử lý bên trong phương thức.
    • Abstract class có thể khai báo và viết code như bình thường cho những phương thức không phải là abstract.
    • Phương thức abstract chỉ được khai báo trong abstract class.
    • Các thuộc tính trong abstract class không thể khai báo là abstract.
    • Abstract class không thể khởi tạo.
    • Vì không thể khởi tạo abstract class, nên các phương thức abstract chỉ được khai báo ở mức độ protected và public.
    • Các lớp con kế thừa từ abstract class phải định nghĩa lại tất cả các phương thức trong abstract class đó (nếu không sẽ bị lỗi).

Để 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.

4.1.2. Interface

  • Interface trong lập trình hướng đối tượng là một khuôn mẫu, giúp tạo ra bộ khung cho một hoặc nhiều đối tượng và cho phép xác định các phương thức và các thuộc tính cố định sẽ có trong đối tượng implement nó.

Để 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:

  • Không phải là một đối tượng.
  • Trong interface, chúng ta chỉ được khai báo phương thức mà không được định nghĩa chúng.
  • Trong interface có thể khai báo các hằng số (hằng) nhưng không thể khai báo các biến.
  • Một interface không thể khởi tạo (vì nó không phải là một đối tượng).
  • Các lớp implement interface phải khai báo và định nghĩa lại các phương thức có trong interface đó.
  • Một class có thể implements nhiều interface.
  • Các interface có thể kế thừa lẫn nhau.

4.1.3. So sánh giữa interface và abstract class

  • Đều không thể khởi tạo đối tượng.
  • Đều có thể chứa các phương thức abstract.

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.

4.2. Tính kế thừa (inheritance)

  • Tính kế thừa cho phép một lớp 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.
  • Tính kế thừa cho phép các đối tượng có thể mở rộng hoặc tái sử dụng các đặc tính đã có mà không cần phải định nghĩa lại.

Để 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.

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 của nó.
  • Để thực hiện tính đóng gói trong PHP, chúng ta sử dụng các từ khoá public, private và protected.

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 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 đó.

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) hoạt động như một biến toàn cục. Bất kể nó được xử lý trong bất kỳ file nào (trong cùng một chương trình), static vẫn lưu trữ giá trị cuối cùng được gán vào trong lớp.

Để 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).

5.2. Phân biệt cách dùng từ khoá static::method() với self::method()

  • Quan sát chung, cả selfstatic đề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ả:

  • self: Truy xuất đến class khai báo nó.
  • static: Truy xuất đến đối tượng hiện tại.

Kết luận

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

Đinh Thái Hoàng

Đinh Thái Hoàng - tác giả của Laptrinhc.edu.vn, chuyên sâu trong lĩnh vực lập trình. Trang web chia sẻ kiến thức, hướng dẫn và tin tức về lập trình, giúp bạn khám phá thế giới mã nguồn và nâng cao kỹ năng coder.

Published by

Bài đăng mới nhất

Tổng hợp app bán hàng online uy tín nhất tại Việt Nam

Tổng hợp app bán hàng online uy tín nhất tại Việt Nam

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…

4 ngày ago

HỌC THIẾT KẾ MOBILE APP Ở ĐÂU UY TÍN?

Mobile App đang trở thành một phần thiết yếu trong cuộc sống hiện đại. Với…

4 ngày ago

Cách phá mật khẩu Windows bằng DLC Boot

Bạn đã bao giờ quên mật khẩu máy tính và không biết phải làm sao?…

4 ngày ago

Cách kiểm tra và cài đặt Driver cho Windows 10 chuẩn nhất

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…

4 ngày ago

Top 10 công cụ viết phần mềm tốt nhất

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…

4 ngày ago

Những Công Ty Lập Trình Ứng Dụng Cho IOS Hàng Đầu Việt Nam

Lập trình ứng dụng cho iOS không chỉ đơn thuần là một quyết định khó…

4 ngày ago