Tính trừu tượng trong php

Ở bài viết trước chúng ta đã tìm hiểu về OOP trong PHP là gì và mình có nói là OOP trong PHP có 4 tính chất. Trong bài viết này chúng ta sẽ cùng nhau tìm hiểu chi tiết về 4 tính chất này, từ đó phục vụ cho các bài tiếp theo.

Tính trừu tượng trong php
4 tính chất OOP trong PHP

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, mà trong đó chỉ bao gồm những đặc điểm quan tâm và bỏ qua những đặc điểm chi tiết nhỏ. Quá trình trừu tượng hóa dữ liệu giúp ta xác định được những thuộc tính, hành động nào của đối tượng cần thiết sử dụng cho chương trình.

Để hiểu rõ về tính trừu tượng chúng ta sẽ tìm hiểu về Abstract class Interface.

1.1. Abstract class

Lớp Abstract sẽ định nghĩa các phương thức (hàm) mà từ đó các lớp con sẽ kế thừa nó và Overwrite lại (tính đa hình).

Đối với lớp này thì nó sẽ có các điểm khác sau:

  • Các phương thức ( hàm ) khi được khai báo là abstract thì chỉ được định nghĩa chứ không được phép viết code xử lý trong phương thức.
  • Trong abstract class nếu không phải là phương thức abstract thì vẫn khai báo và viết code được như bình thường.
  • Phương thức abstract chỉ có thể khai báo trong abstract class.
  • Các thuộc tính trong abstract class thì không được khai báo là abstract.
  • Không thể khởi tạo một abstract class.
  • Vì không thể khởi tạo được abstract class nên các phương thức được khai báo là abstract chỉ được khai báo ở mức độ protected và public.
  • Các lớp kế thừa mộ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).

Và để khai báo một abstract class ta dùng cú pháp sau:

abstract class ClassName

{

}

Trong đó: ClassName là tên của class chúng ta cần khai báo.

Cú pháp khai báo một phương thức abstract:

abstract visibility function methodName();

Trong đó: visibility là một trong 2 từ khóa publicprotected hoặc có thể bỏ trống (bỏ trống thì là public), methodName là tên của phương thức chúng ta cần khai báo.

Ví dụ 1: khai báo một phương thức abstract trong abstract class

1

2

3

4

5

6

7

8

9

10

11

12

abstract class ConNguoi

{

    //khai báo một abstract method đúng

    abstract public function getName();

    //Sai vì abstract class không thể viết code xử lý được

    abstract public function getHeight()

    {

        //

    }

}

Ví dụ 2: Phải định nghĩa lại các phương thức abstract của abstract class đó khi kế thừa.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

abstract class ConNguoi

{

    protected $name;

    abstract protected function getName();

}

//class này sai vì chưa định nghĩa lại phương thức abstracs getName

class NguoiLon extends ConNguoi

{

    //

}

//class này đúng vì đã định nghĩa lại đầy đủ các phương thức abstract

class TreTrau extends ConNguoi

{

    public function getName()

    {

        return $this->name;

    }

}

1.2. Interface

Interface trong hướng đối tượng là một khuôn mẫu, giúp cho chúng ta tạo ra bộ khung cho một hoặc nhiều đối tượng và nhìn vào interface thì chúng ta hoàn toàn có thể xác định được các phương thức và các thuộc tính cố định (hay còn gọi là hằng) sẽ có trong đối tượng implement nó.

Để khai báo interface trong PHP chúng ta dùng cú pháp:

interface InterfaceName

{

}

Trong đó: InterfaceName là tên của interface các bạn muốn đặt.

Tính chất của interface

  • Interface không phải là một đối tượng.
  • Trong interface chúng ta chỉ được khai báo phương thức chứ không được định nghĩa chúng.
  • Trong interface chúng ta có thể khai báo được hằng nhưng không thể khai báo biến.
  • Một interface không thể khởi tạo được (vì nó không phải là một đối tượng).
  • Các lớp implement interface thì 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.

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

Những điểm giống nhau giữa interface và abstract class:

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

Những điểm khác nhau:

InterfaceAbstract 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à cũng không có 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 1 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.
Cần thời gian để tìm phương thức thực tế tương ứng với lớp dẫn đến thời gian chậm hơn 1 chút. Nhanh hơn so với interface.
Khi ta thêm mới 1 khai báo. Ta phải tìm hết tất cả những 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 1 phương thức mới ta hoàn toàn có thể định nghĩa nội dung phương thức là rỗng hoặc những thực thi mặc định nào đó. Vì thế toàn bộ hệ thống vẫn chạy bình thường.
Sự khác nhau giữa Interface và Abstract class

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

Tính kế thừa trong lập trình hướng đối tượng cho phép một lớp (class) 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.

Điều này cho phép các đối tượng có thể tái sử dụng 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 để khai báo kế thừa từ một lớp cha chúng ta sử dụng từ khóa extends theo cú pháp:

class childClass extends parentClass

{

    //code

}

Trong đó: childClass là class mà các bạn đang muốn khởi tạo, parentClass là class cha mà childClass đang muốn kế thừa nó.

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 nội tại của nó mà thôi. Các đối tượng khác muốn thay đổi thuộc tính thành viên của đối tượng nội tại, thì chúng cần truyền thông điệp cho đối tượng, và việc quyết định thay đổi hay không vẫn do đối tượng nội tại quyết định. Trong PHP việc đóng gói được thực hiện nhờ sử dụng các từ khoá publicprivate và protected:

  • Private là giới hạn hẹp nhất của thuộc tính và phương thức trong hướng đối tượng. Khi các thuộc tính và phương thức khai báo với giới hạn này thì các thuộc tính phương thức đó chỉ có thể sử dụng được trong class đó, bên ngoài class không thể nào có thể sử dụng được nó kể cả lớp kế thừa nó cũng không sử dụng được, nếu muốn lấy giá trị hoặc gán giá trị ở bên ngoài class thì chúng ta phải thông qua hai hàm SET và GET.
  • Protected: Khác với private một chút thì các phương thức và thuộc tính khi khai vào với visibility là protected thì chúng ngoài được sử dụng trong class đó ra thì class con kết thừa từ nó cũng có thể sử dụng được, nhưng bên ngoài class không thể sử dụng được.
  • Public: Đây là visibility có mức độ truy cập rộng nhất trong hướng đối tượng, khi một thuộc tính hay phương thức sử dụng visibility này thì chúng ta có thể tác động vào thuộc tính hay phương thức đó từ cả trong lẫn ngoài class. Thông thường khi không khai báo visibility thì chương trình dịch tự nhận nó là public nhưng để cho đúng chuẩn thì mọi người lên khai báo từ khóa này vào thay vì bỏ trống.

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 hình 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 hoàn toàn khác nhau như: con heo ăn cám, hổ ăn thịt, con người thì … ăn hết =)).

Đó là sự đa hình trong thực tế, còn đa hình trong lập trình thì được hiểu là Lớp Con sẽ viết lại những phương thức ở lớp cha (ovewrite).

Các class cùng implement một interface nhưng chúng có cách thức thực hiện khác nhau cho các method của interface đó.

5. Kết luận

Trong bài viết chúng ta đã tìm hiểu về các đặc trưng cơ bản của 4 tính chất OOP trong PHP. Ở bài viết sau, chúng ta sẽ tìm hiểu về class và object trong OOP nhé.

Bài viết tham khảo: https://viblo.asia/p/lap-trinh-huong-doi-tuong-oop-trong-php-phan-1-gGJ59gyaZX2

php oop