Trong lập trình, khái niệm lập trình hướng đối tượng (OOP) là một khái niệm rất quan trọng. Cùng với OOP, mã sẽ được tổ chức thành các đối tượng và lớp, bằng cách này mã nguồn của chúng ta sẽ dễ đọc, dễ bảo trì cũng như dễ dàng mở rộng hơn so với cách viết thông thường. Trong bài viết này, chúng ta sẽ tìm hiểu về cách triển khai lập trình hướng đối tượng trong PHP.

Bạn muốn trở thành một nhà lập trình PHP chuyên nghiệp? Hãy bắt đầu với cuốn Ebook hữu ích từ Stringee! 

>>> ĐĂNG KÝ NHẬN EBOOK PHP MIỄN PHÍ TẠI ĐÂY:  

1. Lý do sử dụng lập trình hướng đối tượng (OOP) với PHP

  • Tính tổ chức và tái sử dụng mã nguồn: Trong OOP, chúng ta sẽ nhận thấy rằng mọi thứ trong mã nguồn sẽ được phân chia thành các đối tượng và phương thức riêng biệt. Với việc quản lý mã nguồn theo từng đối tượng, nó khiến cho mã nguồn của chúng ta dễ đọc, dễ hiểu hơn, từ đó khiến cho mã dễ bảo trì cũng như đảm bảo sự tiện lợi trong quá trình tái sử dụng mã.
  • Tính đóng gói và ẩn thông tin: Trong OOP, các dữ liệu và phương thức liên quan thường được đóng gói vào một đối tượng. Cùng với điều này, nó đảm bảo rằng các thành phần của đối tượng sẽ chỉ được phép truy cập bằng những phương thức công khai. Từ đó giúp ẩn đi những thông tin chi tiết, đồng thời cũng giảm nguy cơ xảy ra lỗi.
  • Tính kế thừa và đa hình: Tính kế thừa mang lại một cấu trúc phân cấp. Từ những lớp cha đã có sẵn những thuộc tính và phương thức, chúng có thể được kế thừa lại bởi lớp con bằng tính kế thừa. Trong khi đó, đa hình mang lại khả năng triển khai các thuộc tính và phương thức bằng những cách khác nhau trong các lớp con.

2. Các khái niệm cơ bản trong OOP

a. Lớp và đối tượng

  • Lớp (Class): Lớp là tập hợn các thuộc tính (biến) và phương thức (hàm) mà các đối tượng của từng lớp có thể sử dụng.
  • Đối tượng (Object): Đối tượng là sự thể hiện cụ thể của một lớp. Nó có thể sử dụng các giá trị và các phương thức của lớp tạo ra nó.

b. Thuộc tính và phương thức

  • Thuộc tính (Property/Attribute): Đây là các biến dùng để lưu trữ dữ liệu và chúng được định nghĩa ở trong lớp.
  • Phương thức (Method): Đây là các hàm để thực hiện một chức năng nhất định có liên quan đến đối tượng và chúng cũng được định nghĩa ở trong lớp.

c. Hàm khởi tạo (Constructor) và Hàm hủy (Destructor)

  • Hàm khởi tạo (Constructor): Đây là một phương thức đặc biệt, nó sẽ được gọi ngay sau khi đối tượng của lớp đó được tạo ra. Thông thường trong hàm khởi tạo chúng ta sẽ khởi tạo các thuộc tính của đối tượng để có thể sử dụng khi cần thiết.
  • Hàm hủy (Destructor): Ngược lại với hàm khởi tạo, hàm hủy có tác dụng giải phóng tài nguyên mà đối tượng đã sử dụng. Hàm này được gọi sau khi đối tượng bị xóa bỏ khỏi bộ nhớ.

- Giới hạn ký tự hiển thị và chức năng read more trong PHP 
- Tìm hiểu về hàm preg_match_all trong PHP 
- Các hàm thông dụng để làm việc với chuỗi trong PHP

3. Định nghĩa lớp và tạo đối tượng

Trong PHP, từ khóa class được sử dụng để định nghĩa một lớp, theo sau đó là tên của lớp và một cặp dấu ngoặc nhọn dùng để định nghĩa các thành phần trong lớp:

class Stringee {
    // Thuộc tính
    public $company;
    public $address;

    // Hàm khởi tạo
    function __construct($company, $address) {
        $this->company = $company;
        $this->address = $address;
    }

    // Phương thức
    function getCompany() {
        return 'Tên công ty: ' . $this->company;
    }
}

// Tạo đối tượng từ lớp Stringee
$stringee = new Stringee('CÔNG TY CỔ PHẦN STRINGEE', 'Tầng 19, Tòa Leadvisors Tower, Số 643 Phạm Văn Đồng, Quận Bắc Từ Liêm, Hà Nội');

// Gọi phương thức
echo $stringee->getCompany(); // Kết quả: Tên công ty: CÔNG TY CỔ PHẦN STRINGEE

Trong ví dụ trên, chúng ta có thể thấy lớp Stringee bao gồm 2 thuộc tính là companyaddress, trong đó hàm khởi tạo __construct() dùng để khởi tạo các thuộc tính trên, phương thức getCompany() được sử dụng để trả về thông điệp có trên giá trị của biến company.

4. Kế thừa và đa hình

  • Kế thừa (Inheritance)

Với tính kế thừa, khi chúng ta có một lớp cha gồm các thuộc tính và phương thức, chúng ta hoàn toàn có thế kế thừa nó cho lớp con, lúc này những gì có ở lớp cha thì lớp con cũng đều sử dụng được. Điều này áp dụng rất hiệu quả cho việc tái sử dụng mã nguồn cũng như là xây dựng các cấu trúc phân cấp.

class Information extends Stringee {
    public $email;
    
    function __construct($company, $address, $email) {
        parent::__construct($company, $address);
        $this->email = $email;
    }
    
    // Ghi đè phương thức đã có trong lớp cha
    function getCompany() {
        return $this->company . ', địa chỉ: ' .  $this->address .', mọi thắc mắc gửi vào hòm thư: ' . $this->email;
    }
}
    
$infor = new Information('CÔNG TY CỔ PHẦN STRINGEE', 'Tầng 19, Tòa Leadvisors Tower, Số 643 Phạm Văn Đồng, Quận Bắc Từ Liêm, Hà Nội', 'info@stringee.com');

echo $infor->getCompany();
// Kết quả: CÔNG TY CỔ PHẦN STRINGEE, địa chỉ: Tầng 19, Tòa Leadvisors Tower, Số 643 Phạm Văn Đồng, Quận Bắc Từ Liêm, Hà Nội, mọi thắc mắc gửi vào hòm thư: info@stringee.com
  • Đa hình (Polymorphism)

Trong khi làm việc với mã nguồn, chúng ta sẽ gặp nhiều trường hợp mã nguồn gốc khi thay đổi sẽ gây ra lỗi hoặc khi thay đổi nó có thể gây ra sự thay đổi quá lớn ở những đoạn mã không liên quan. Với tính đa hình, nó giúp cho chúng ta có thể triển khai các phương thức này theo những cách khác nhau trong các lớp con và đảm bảo không ảnh hưởng đến mã nguồn gốc.

$strigee = new Stringee('CÔNG TY CỔ PHẦN STRINGEE', 'Tầng 19, Tòa Leadvisors Tower, Số 643 Phạm Văn Đồng, Quận Bắc Từ Liêm, Hà Nội');

$infor = new Information('CÔNG TY CỔ PHẦN STRINGEE', 'Tầng 19, Tòa Leadvisors Tower, Số 643 Phạm Văn Đồng, Quận Bắc Từ Liêm, Hà Nội', 'info@stringee.com');

function showData($object) {
    // Ở đây phương thức getCompany() sẽ được lấy tùy theo đối tượng truyền vào
    echo $object->getCompany() . "\n";
}

showData($strigee);
// Kết quả: Tên công ty: CÔNG TY CỔ PHẦN STRINGEE
showData($infor);
// Kết quả: CÔNG TY CỔ PHẦN STRINGEE, địa chỉ: Tầng 19, Tòa Leadvisors Tower, Số 643 Phạm Văn Đồng, Quận Bắc Từ Liêm, Hà Nội, mọi thắc mắc gửi vào hòm thư: info@stringee.com

5. Đóng gói và ẩn thông tin

Một trong những điều quan trọng khi chúng ta làm việc với một chương trình là tính toàn vẹn của dữ liệu cũng như chức năng của đối tượng. Trong OOP đây là một trong những ưu điểm rất quan trọng, bởi nó giúp ẩn các thông tin chi tiết và nó chỉ cung cấp một giao diện công khai để chúng ta tương tác với các đối tượng mà nó cho phép.

class Sum {
    private $sum = 0;

    public function addSum($arr) {
        if ($arr) {
            foreach ($arr as $v) {
                $this->sum += $v;
            }
        }
    }
    
    public function getSum() {
        return $this->sum;
    }
}

$sum = new Sum();
$sum->addSum([1, 2, 3]);
echo $sum->getSum(); // Kết quả: 6

Trong ví dụ trên, ta có thể dễ dàng thấy rằng thuộc tính sum đã được khai báo private, cho nên nó chỉ có thể truy cập từ bên trong lớp. Phương thức addSum cho phép chúng ta thực hiện cộng tổng và getSum cho phép chúng ta lấy giá trị của sum.

6. Lợi ích của OOP trong PHP

Tái sử dụng mã nguồn (Code Reusability): Các đối tượng có thể được sử dụng lại trong nhiều dự án khác nhau, giảm việc viết lại mã nguồn và thời gian phát triển.

Dễ bảo trì (Maintainability): Mã nguồn được tổ chức logic, dễ đọc và dễ bảo trì hơn nhờ cấu trúc đối tượng rõ ràng.

Mở rộng dễ dàng (Ease of Extensibility): Khi cần thêm chức năng mới, bạn có thể mở rộng lớp hiện có hoặc tạo lớp con mà không làm thay đổi mã gốc.

Tách biệt dữ Liệu và logic (Data and Logic Separation): OOP giúp tách biệt dữ liệu và logic, đảm bảo tính toàn vẹn dữ liệu và tránh sự tác động trực tiếp lên dữ liệu.

Quản Lý Dự Án Tốt Hơn (Better Project Management): OOP tạo mô hình tương ứng với thế giới thực, cải thiện khả năng giao tiếp và hiểu rõ hơn về cấu trúc dự án.

Bảo mật và kiểm soát truy cập (Security and Access Control): OOP cho phép bạn kiểm soát truy cập vào dữ liệu và chức năng của đối tượng thông qua việc thiết lập mức độ truy cập.

Tích hợp dễ dàng (Easy Integration): Tách biệt các thành phần cho phép tích hợp dễ dàng hơn với các hệ thống khác mà không cần thay đổi quá nhiều mã.

Phát triển đồng thời (Concurrent Development): OOP tạo điều kiện thuận lợi cho nhiều nhà phát triển làm việc đồng thời trên các phần khác nhau của ứng dụng.

Đa hình và tính Mô-đun (Polymorphism and Modularity): Đa hình giúp thực hiện cùng một hành động với các đối tượng khác nhau. Tính mô-đun giúp quản lý mã nguồn dễ dàng và hiệu quả.

7. Hạn chế của OOP trong PHP

Phức tạp khi ứng dụng nhỏ: Trong một số ứng dụng nhỏ, việc sử dụng OOP có thể tạo ra cấu trúc phức tạp hơn.

Hiệu năng: Trong một số trường hợp, việc sử dụng đối tượng có thể tạo ra tốn kém hiệu năng hơn so với việc sử dụng cấu trúc dữ liệu truyền thống.

Học hỏi phức tạp hơn: Hiểu và áp dụng các khái niệm OOP có thể đòi hỏi thời gian hơn để học so với lập trình hướng thủ tục.

Thừa kế quá mức (Over Abstraction): Khi thiết kế lớp quá phức tạp và abstraction quá cao, có thể dẫn đến việc khó hiểu và không cần thiết.

Tốn bộ nhớ: Mỗi đối tượng chiếm bộ nhớ riêng nên dẫn đến sự tốn kém tài nguyên khi ứng dụng có nhiều đối tượng.

Khả năng rò rỉ bộ nhớ (Memory Leakage): Không quản lý tốt, các tham chiếu giữa các đối tượng có thể dẫn đến rò rỉ bộ nhớ.

Khả năng phức tạp hoá quá mức (Overcomplexity): Thiết kế lớp quá phức tạp có thể làm cho mã nguồn khó đọc và khó bảo trì.

Tổng kết

Nắm vững và sử dụng được lập trình hướng đối tượng trong PHP sẽ phát huy nhiều tác dụng, giúp cho mã của bạn dễ đọc hơn, dễ bảo trì hơn và dễ mở rộng hơn. Với các tính chất đã liệt kê ở trên nếu như áp dụng một cách hợp lý, chúng ta hoàn toàn có thể tạo ra được những ứng dụng với độ phức tạp cao, cấu trúc dễ quản lý đồng thời linh hoạt hơn. OOP không chỉ là một khái niệm, mà còn là một phương pháp tiếp cận hiệu quả.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: