PHP và lập trình hướng đối tượng

    0

    Lập trình hướng đối tượng mặc dù không được hỗ trợ từ đầu nhưng đã trở thành một chủ đề quan trọng trong PHP, bắt đầu từ PHP 5 và hoàn thiện ở PHP 7. Mặc dù sử dụng lập trình hương đối tượng là không bắt buộc trong PHP, sử dụng mô hình lập trình này đặc biệt quan trọng khi xây dựng các project lớn.

    Bắt đầu từ bài học này chúng ta sẽ chuyển sang xem xét chi tiết vấn đề lập trình hướng đối tượng trong PHP, bắt đầu từ những khái niệm và nguyên lý cơ bản nhất, sau đó là các kỹ thuật lập trình hướng đối tượng trong PHP.

    PHP và lập trình hướng thủ tục

    Trong quá trình học PHP căn bản từ đầu đến giờ bạn sử dụng mô hình (paradigm) lập trình hướng thủ tục (procedural programming).

    Lập trình hướng thủ tục là một phần của lập trình hướng mệnh lệnh (imperative programming), trong đó chương trình bao gồm dữ liệu và thuật toán (chuỗi lệnh) xử lý dữ liệu đó.

    Trong mô hình lập trình hướng thủ tục, bạn xây dựng/khai báo các hàm toàn cục (global function) và các biến toàn cục (global variable). Trong đó, hàm thể hiện hành động, biến thể hiện dữ liệu.

    So với lập trình hướng mệnh lệnh, lập trình hướng thủ tục khác biệt ở một điều là có thể gom biến và lệnh vào một đơn vị mới là hàm (toàn cục). Tùy ngôn ngữ, hàm còn được gọi là chương trình con, hoặc thủ tục.

    Mô hình lập trình này cũng gặp trong C, Pascal và nhiều ngôn ngữ lập trình lâu đời khác.

    Xây dựng hàm nghĩa là mô tả những gì hàm có thể làm. Khai báo biến nghĩa là mô tả thông tin mà biến có thể chứa.

    Cả hàm và biến đều có tính toàn cục. Tính “toàn cục” thể hiện ở chỗ các function và biến (toàn cục) có thể được truy xuất từ bất kỳ vị trí nào của chương trình.

    Ở phần khác của chương trình, bạn sử dụng (gọi) hàm (hành động) để tác dụng lên biến (dữ liệu).

    Như vậy, một chương trình hướng thủ tục là một tập hợp của các khai báo hàm và lời gọi hàm tác động lên các biến toàn cục.

    PHP và lập trình hướng đối tượng

    Lập trình hướng đối tượng (Object-Oriented Programming hay OOP) là xu hướng lập trình phổ biến nhất hiện nay. Các ngôn ngữ lập trình quen thuộc hỗ trợ xu hướng này bao gồm C#, Java, Python, C++, Kotlin, v.v..

    Ở những phiên bản đầu tiên, PHP không hỗ trợ lập trình hướng đối tượng mà chỉ có mô hình (paradigm) lập trình hướng thủ tục (procedural programming). Mô hình lập trình hướng đối tượng chỉ được chính thức hỗ trợ từ PHP 5 và hoàn thiện ở PHP 7.

    Mặc dù hỗ trợ lập trình hướng đối tượng, PHP không phải là một ngôn ngữ hướng đối tượng hoàn toàn. Các kiểu dữ liệu cơ sở của PHP thực tế không phải là class. Thêm vào đó, hỗ trợ lập trình hướng đối tượng trong PHP không mạnh mẽ như các ngôn ngữ hoàn toàn hướng đối tượng khác.

    C# hay Java là các ngôn ngữ hướng đối tượng hoàn toàn với ý nghĩa mọi kiểu dữ liệu trong các ngôn ngữ này đều là class.

    Việc sử dụng lập trình hướng đối tượng trong PHP là không bắt buộc. Bạn hoàn toàn có thể sử dụng mô hình lập trình hướng thủ tục thông thường. Tuy nhiên, nếu lựa chọn hướng nào thì nên sử dụng thống nhất.

    Cần lưu ý rằng, OOP không nhất thiết phải tốt hơn procedural. Việc tạo và quản lý object khiến PHP mất nhiều thời gian xử lý hơn, cũng có nghĩa là sẽ giảm hiệu suất.

    Tuy nhiên, sử dụng lập trình hướng đối tượng giúp bạn tổ chức code tốt hơn, đặc biệt với các project lớn. Nếu sử dụng OOP bạn cũng tận dụng được các nguyên lý (SOLID) và thiết kế (Design pattern) rất phổ biến và hữu ích của mô hình lập trình này.

    Để áp dụng lập trình hướng đối tượng, dù trong PHP hay trong bất kỳ ngôn ngữ nào, bạn cần phải nắm được các khái niệm và nguyên lý cơ bản của lập trình hướng đối tượng. Tiếp sau đó bạn cần học các cú pháp riêng của ngôn ngữ để diễn đạt các nguyên lý và khái niệm đó trong code.

    Lập trình hướng đối tượng, class và object

    Lập trình hướng đối tượng là một cách suy nghĩ khác để giải quyết vấn đề bằng chương trình.

    Class

    Trong mô hình lập trình hướng đối tượng, bạn vẫn tiếp tục phải xây dựng hàm và biến. Khác biệt là hàm và biến giờ đây là thành phần của đơn vị khác, gọi là class. Nghĩa là, mỗi class chứa mô tả cho hành động (function) và dữ liệu (biến).

    Như vậy, chương trình theo mô hình hướng đối tượng được phân chia thành các class. Hành động và dữ liệu không còn mang tính chất “toàn cục”. Thay vào đó, chúng là thành phần của mỗi class xác định. Hàm và biến khi này được gọi là hàm thành viên và biến thành viên.

    Trong PHP, biến thành viên của class được gọi là thuộc tính (property), còn hàm thành viên của class được gọi là phương thức (method).

    Mỗi class trở thành một bộ phận tương đối độc lập của chương trình chứa mô tả cho dữ liệu và hành động. Thường class được hiểu và diễn tả như kiểu dữ liệu trong các ngôn ngữ hướng đối tượng.

    Class cũng có thể hình dung như là mô hình hóa (trừu tượng hóa) của mỗi hiện tượng sự vật cụ thể, chứa thông tin và hành vi riêng.

    Trong lập trình hướng thủ tục, sau khi khai báo biến và hàm, bạn phải sử dụng chúng để chúng thực sự xử lý công việc cho bạn. Class, với đặc thù như trên, có thể xem như là nơi kết hợp mô tả của hàm và biến. Như vậy, bạn cũng phải “sử dụng” class để xử lý công việc cho mình.

    Object

    Trong lập trình hướng đối tượng, bạn không trực tiếp sử dụng các hàm và biến khai báo trong class. Thay vào đó, từ class bạn phải tạo ra object – một đơn vị mới. Từ object đó bạn mới có thể gọi các hàm và truy xuất biến chứa trong nó.

    Có thể hình dung class như một bản thiết kế, còn object là một vật cụ thể làm ra từ bản thiết kế. Với ý nghĩa đó, class (bản thiết kế) chỉ là những mô tả, còn object (vật cụ thể) mới là những thứ chúng ta có thể sử dụng.

    Do class được dùng để mô tả chung cho các object tương tự nhau, class có thể được hình dung như một kiểu dữ liệu. Khi đó, mỗi object có thể được xem là một biến tạo ra từ kiểu dữ liệu class.

    Các biến (object) tạo từ cùng một kiểu (class) mặc dù có chứa cùng các nhóm thông tin và hành động nhưng giá trị cụ thể (trạng thái) của chúng không giống nhau. Điều này cũng tương tự như cùng là sinh viên (class) nhưng sinh viên Nguyễn Văn A khác với sinh viên Trần Văn B.

    Class và object là hai khái niệm cơ bản nhất của lập trình hướng đối tượng. Hai khái niệm này giúp cho lập trình hướng đối tượng có thể mô hình hóa các sự vật hiện tượng một cách dễ dàng và chính xác hơn.

    Khi viết chương trình theo mô hình hướng đối tượng người ta sẽ tập trung vào xây dựng class (kiểu dữ liệu) và sử dụng class để tạo ra object (biến). Object (chứa hành động và dữ liệu cụ thể) sẽ được dùng để giải quyết vấn đề của chương trình.

    Các nguyên lý chung của lập trình hướng đối tượng

    Để sử dụng được lập trình hướng đối tượng, bạn cần nắm được các nguyên lý cơ bản của nó: bao đóng (encapsulation), kế thừa (inheritance), đa hình (polymorphism).

    Bao đóng trong lập trình hướng đối tượng thể hiện qua việc (1) tổ hợp hành động (hàm) và dữ liệu (biến) vào một đơn vị tổ chức khác (class), cũng như (2) giới hạn việc truy xuất các thành phần này.

    Như vậy, khi xây dựng một class bạn luôn thực hiện nguyên lý bao đóng, thể hiện qua việc khai báo các hàm và biến trong khuôn khổ của một class. Bao đóng giúp biến class thành một đơn vị độc lập, bao gồm cả hành động và dữ liệu, và qua đó giúp mô phỏng chính xác hoạt động của các sự vật hiện tượng thực tế.

    Một số thành viên của class có thể được truy xuất từ ngoài class, một số bị giới hạn truy xuất trong nội bộ class đó. Các ngôn ngữ lập trình thường cho phép giới hạn truy xuất các thành viên với các từ khóa điều khiển truy cập (private, public, protected).

    Kế thừa trong lập trình hướng đối tượng là cơ chế tái sử dụng code cho phép tạo ra class mới trên cơ sở của một class sẵn có. Dựa trên cơ chế kế thừa, bạn có thể xây dựng một class mới mở rộng một class sẵn có.

    Ví dụ, một ai đó đã xây dựng sẵn một class nhưng khi bạn sử dụng lại thiếu một vài tính năng. Thay vì làm hết mọi thứ từ đầu, bạn có thể xây dựng một class mới kế thừa từ class sẵn có. Class mới này chứa đầy tính năng của class cũ, đồng thời có những gì bạn tự viết thêm.

    Kế thừa chủ yếu thể hiện quan hệ cú pháp giữa các class: code của class này chứa code của class kia.

    Đa hình trong lập trình hướng đối tượng thể hiện mối quan hệ giữa các class trong cây kế thừa: class con có thể được đối xử giống như đối với class cha.

    Thường đa hình thể hiện quan hệ ngữ nghĩa (is-a) giữa các class cha và con. Object của class con cũng đồng thời là object của class cha.

    Ví dụ, nếu một hàm yêu cầu tham số kiểu cha, bạn có thể cung cấp object kiểu con cho nó.

    + Nếu bạn thấy site hữu ích, trước khi rời đi hãy giúp đỡ site bằng một hành động nhỏ để site có thể phát triển và phục vụ bạn tốt hơn.
    + Nếu bạn thấy bài viết hữu ích, hãy giúp chia sẻ tới mọi người.
    + Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần thảo luận cuối trang.
    Cảm ơn bạn!

    Kết luận

    Trong bài học này chúng ta nhắc lại những khái niệm và nguyên lý cơ bản của lập trình hướng đối tượng:

    • Class,
    • Object,
    • Encapsulation (bao đóng),
    • Inheritance (kế thừa),
    • Polymorphism (đa hình).

    Cũng lưu ý rằng, bài học này không hướng tới giúp bạn hiểu cặn kẽ về lập trình hướng đối tượng nói chung. Như đã trình bày từ bài giới thiệu, bạn nên theo học lập trình hướng đối tượng một cách bài bản trước khi bắt đầu học PHP.

    Trong bài học tiếp theo chúng ta sẽ xem xét cú pháp khai báo class trong PHP.

    Subscribe
    Notify of
    guest
    0 Thảo luận
    Inline Feedbacks
    View all comments