Học lập trình hướng đối tượng với PHP (Phần 1)

1214
Học lập trình hướng đối tượng với PHP

Trong series này, mình sẽ đi từ cơ bản đến nâng cao về học lập trình hướng đối tượng với PHP . Nếu bạn chưa có kiến thức về PHP, có thể tham khảo thêm tài liệu học PHP nhé.

Trong phần 1 của series này chúng ta sẽ tìm hiểu về:

  • Thế nào là lập trình hướng đối tượng (OOP)
  • Các đặc trưng cơ bản của của OOP
  • Phân biệt Abstract Class và Interface.
  • Thế nào là một hàm static
  • Phân biệt dùng từ khóa static::method() và self::method()

Lập trình hướng đối tượng là gì? Ưu điểm của nó?

Lập trình hướng đối tượng (gọi tắt là OOP – object-oriented programming) là một kĩ thuật công nghệ đối tượng.

Nếu trước kia là các kiểu lập trình hướng thủ tục, hướng modun,… thì giờ đây thế giới đang ưu về sử dụng hướng đối tượng. Ngày trước, chúng ta lập trình với hướng thủ tục thì sẽ thành các hàm để xử lý, còn giờ đây khi sử dụng hướng đối tượng thì chúng ta sẽ chia thành các đối tượng để xử lý.

Vì OOP 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ác ưu điểm sau:

  • Dễ dàng quản lý dự án code khi có sự thay đổi chương trình.
  • Dễ mở rộng dự án.
  • Có tính bảo mật cao.
  • Có thể sử dụng mã nguồn, tiết kiệm tài nguyên.

Xem thêm chi tiết về OOP là gì?

Các đặc điểm cơ bản của lập trình hướng đối tượng.

Tính đóng gói (encapsulation)

Tính chất này không cho phép người dùng trực tiếp tác động đến dữ liệu bên trong đối tượng mà phải thông qua các phương thức mà đối tượng cung cấp. Tính chất này đảm bảo tính toàn vẹn của đối tượng.

Trong PHP, có các access modifier như sau:

Tính trừu tượng (Abstraction)

Việc bỏ qua hoặc ẩn đi những xử lý phức tạp bên dưới mà chỉ đưa ra các chức năng hoặc tập trung vào các cốt lõi cần thiết được gọi là tính trừu tượng của dữ liệu.

Tính trừu tượng còn được thể hiện qua việc một đối tượng ban đầu có thể có 1 số đặc điểm chung cho nhiều đối tượng khác. Ví dụ như là sự mở rộng của nó nhưng bản thân đối tượng ban đầu này không có các biện pháp thi hành. Tính chất này thường được xác định trong khái niệm gọi là lớp trừu tượng.

PHP có class, abstract class, interface để trừu tượng hóa các đối tượng.

Ví dụ với các hình vuông, hình tròn ta trựu tượng nó lên sẽ thuộc lớp Hình có phương thức tính diện tích:

Tính kế thừa (Inheritance)

Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho phép các đối tượng chia sẻ 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, một lớp con kế thừa 1 lớp cha thì nó có sẵn các thuộc tính và phương thức được khai báo public hoặc protected của lớp cha.

Ta có một ví dụ để hiểu rõ hơn về kế thừa trong PHP:

Tính đa hình (Polymorphism)

Thể hiện qua việc có thể định nghĩa một đặc tính hoặc phương thức cho một loạt các đối tượng gần nhau khi thực hiện cùng một tên gọi, mà sự thực hiện của mỗi đối tượng khác nhau sẽ tự động xảy ra tương ứng theo đặc tính của đối tượng đó mà không nhầm lẫn.

Ví dụ: Đối tượng “hình vuông” và “hình tròn” có chung 1 phương thức là “tinhDienTich”. Khi gọi phương thức này thì với mỗi đối tượng sẽ có 1 công thức tính khác nhau.

Trong PHP, các lớp con có thể override phương thức của lớp nó kế thừa. Các class cùng implement các interface khác nhau có implement khác nhau cho các method của interface đó. Qua đó phương thức sẽ cho kết quả khác nhau khi được gọi bởi các đối tượng thuộc lớp khác nhau.

Ta có ví dụ class HinhTron và HinhVuong thực hiện đa hình từ phương thức tinhDienTich() kế thừa từ lớp cha  Hinh như sau:

Xem thêm 4 tính chất của lập trình hướng đối tượng trong Java

Sự khác biệt giữa Abstract và Interface

Trong phần các tính chất của lập trình hướng đối tượng, ta đã đề cập đến tính chất trừu tượng và trong PHP có có class, abstract class, interface để trừu tượng hóa các đối tượng. Cùng so sánh Abstract và Interface thử nhé:

  • Abstract Class: được xem như một class cha cho tất cả các Class có cùng bản chất.
  • Interface: được xem như một mặt nạ cho tất cả các Class cùng các thức hoạt động nhưng có thể khác nhau về bản chất. Ví dụ:
    • Abstract Class alcohol có các lớp con whisky, wine.
    • Abstract Class soda có các lớp con pepsi, sprite.
    • Interface gồm có dink, durk. Ta có thể thấy rõ rắng whisky và pepsi sẽ có chung là drink nhưng pepsi thì không thể kế thừa Abstract Class alcohol.
  • Điểm chung:
    • Không khởi tạo được đối tượng.
    • Khai báo phương thức nhưng không thực hiện chúng.
    • Được thực thi từ các lớp dẫn xuất.
    • Các lớp có thể kế thừa lẫn nhau.
  • Khác:
    • Abstract class:
      • Mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa (extend) từ 1 lớp trừu tượng.
      • Phương có thể có code hoặc không.
      • Định nghĩa cốt lõi cho lớp và sử dụng cho các đối tượng cùng bản chất.
      • Có thể khai báo thuộc tính và hằng.
      • Các lớp con cần phải thực thi toàn bộ các phương thức abstract method. Còn các phương còn lại tùy ý.
    • Interface:
      • Lớp dẫn xuất (lớp con) có thể kế thừa từ nhiều Interface khác nhau để bổ sung cách thức hoạt động của mình.
      • Chỉ khai báo phương thức không được định nghĩa chúng.
      • Có thể khai báo được hằng nhưng không thể khai báo biến.

Thế nào là một hàm static?

  • Phương thức static là phương thức có thể truy cập mà không cần khởi tạo một đối tượng của Class.
  • Đây là những địa chỉ có một, có địa chỉ xác định và không thay đổi địa chỉ trên vũng nhớ (tĩnh).
  • Khi chương trình chạy, nó sẽ được sinh ra đầu tiên trước tất cả các truy cập tới nó và tồn tại cho tới khi chương trình kết thúc.
  • Khai báo một phương thức static trong một class như sau:

Phân biệt cách dùng từ khóa static::mothod() với self::method()

  • self::method() tham chiếu đến hàm method tại thời điểm nó được định nghĩa.
  • static::method() tham chiếu đến hàm method tại tại thời điểm nó được gọi.
  • Ta có ví dụ để hiểu thêm về cách dùng của 2 từ khóa này như sau:

Tạm kết bài

Phần 1 của series học lập trình hướng đối tượng với PHP đến đây là hết. Cảm ơn mọi người đã theo dõi và hẹn gặp lại mọi nguời ở phần 2 với những nội dung:

  • Thế nào là Trait?
  • Namespaces là gì?
  • Thế nào là magic functions?

Có thể bạn quan tâm:

Xem thêm việc làm PHP Developer trên TopDev

TopDev via viblo.asian