Lập trình hướng đối tượng trong PHP

/ Lập trình web / Php & Mysql
Lập trình hướng đối tượng trong PHP
1

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

Lập trình hướng đối tượng là một kiểu lập trình xoay quanh các đối tượng. Nghĩa là chúng ta sẽ tạo các thành phần nhỏ trong chương trình để giải quyết các vấn đề xoay quanh một đối tượng nào đó, sau đó liên kết các thành phần này trong chương trình chính để giải quyết các vấn đề phức tạp hơn có liên quan đến nhiều đối tượng khác nhau.

 

Các đối tượng được nhắc đến trong khái niệm trên có thể là ánh xạ trực tiếp của các đối tượng trong thế giới thực như nhà, xe..., hoặc là ánh xạ gián tiếp của các đối tượng trong thế giới thực như là một bảng trong CSDL.

 

Tính chất của lập trình hướng đối tượng trong PHP

Có 4 tính chất cơ bản của lập trình hướng đối tượng trong PHP, bao gồm:

  • Tính trừu tượng: Là khả năng trừu tượng hóa việc thực thi các phương thức trong đối tượng. Khả năng thứ nhất là khi đứng ở phạm vi chương trình toàn cục, ta không cần quan tâm đến chi tiết bên trong của các đối tượng được tiến hành như thế nào, ta chỉ cần quan tâm đến khả năng mà đối tượng đó mang lại. Như cách bạn nhờ ai đó làm việc mà chỉ quan tâm đến kết quả, còn quá trình người đó làm như thế nào thì không cần quan tâm vậy. Khả năng thứ hai là khi đứng ở phạm vi của một đối tượng, ta có thể khai báo các phương thức mà không chỉ định cách thực hiện cụ thể. Như cách bạn nói rằng máy móc thì phải có chức năng nạp nhiên liệu, còn cách nạp chi tiết như thế nào thì bạn không quy định, mà để việc quy định đó cho từng loại máy cụ thể tiến hành (ví dụ: xe máy chạy xăng thì nạp xăng, xe đạp điện thì nạp điện...).
  • Tính đa hình: Các đối tượng gần giống nhau về mặt nào đó, có các phương thức với tên gọi như nhau nhưng cách thực hiện sẽ khác nhau. Ví dụ, đối tượng "hình vuông" và "hình tròn" thì đều là "hình học", và có chung một phương thức "tính chu vi", nhưng hình tròn thì công thức tính khác hình vuông.
  • Tính đóng gói và che giấu thông tin: Đóng gói nghĩa là các thuộc tính và phương thức liên quan đến một đối tượng nào đó thì sẽ được khai báo trong đối tượng đó. Che giấu thông tin nghĩa là khả năng mà chỉ trong phạm vi của đối tượng mới được phép thay đổi thông tin của đối tượng. Lưu ý, việc che giấu thông tin là không bắt buộc.
  • Tính kế thừa: Một đối tượng có thể kế thừa các thuộc tính và phương thức có sẵn của MỘT đối tượng khác.

 

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

Dựa vào các tính chất như trên, hướng đối tượng trong PHP sẽ mang lại nhiều ưu điểm, một số nổi bật như:

Tăng năng suất làm việc. Có thể cho phép làm việc với một số lượng lớn các thành viên, mà mỗi người sẽ đảm nhiệm việc thao tác trên một hoặc nhiều đối tượng riêng.

- Dễ dàng quản lý, bảo trì, mở rộng. Giờ đây, chương trình đã được xây dựng thành từng khối nhỏ hơn chính là các đối tượng. Chúng ta sẽ dễ dàng kiểm thử và phát hiện sai sót trong từng đối tượng riêng lẻ, từ đó giảm thiểu sai sót và công sức kiểm thử khi liên kết các đối tượng đó với nhau. Việc bảo trì có thể được thực hiện tốt hơn dựa vào việc chia nhỏ như vậy, chúng ta có thể lên lịch bảo trì chương trình theo từng khối chức năng, từng đối tượng. Và phần hấp dẫn nữa là mở rộng, có thể nói đây là bài toán khó trong lập trình. Thật may, lập trình hướng đối tượng mang lại cho chúng ta khả năng mở rộng hầu như là vô tận, khi mà việc mở rộng một đối tượng nào đó có thể (hoặc rất ít) tác động trực tiếp trên chính đối tượng đó. Ví dụ, chúng ta có thể mở rộng một đối tượng bằng cách tạo đối tượng khác kế thừa từ đối tượng cần mở rộng.

- Tiết kiệm công sức. Chúng ta có thể sử dụng một lượng rất lớn các đối tượng đã được xây dựng sẵn từ cộng đồng vào trong dự án của mình, từ đó giúp tiết kiệm được thời gian, công sức, và chi phí. Chúng ta có nhiều thời gian hơn để tập trung vào logic chính yếu và riêng biệt mà dự án của mình đang hướng tới.

- Tăng cường bảo mật. Các dữ liệu nhạy cảm hoặc không cần thiết sẽ được đóng gói trong các đối tượng, và chúng ta có thể đặt phạm vi nội bộ cho các dữ liệu này để ngoài phạm vi của đối tượng thì sẽ không truy cập được. Nói một cách khác, bảo mật ở đây chính là việc các dữ liệu chỉ có khả năng truy cập tại những nơi mà chúng ta cho phép.

 

Các khái niệm chính trong lập trình hướng đối tượng trong PHP

- Class: Là khuôn mẫu để dựng nên các đối tượng.

- Object: Là các đối tượng được đề cập đến trong khái niệm của lập trình hướng đối tượng. Các bạn xem lại phần đầu bài viết nhé.

- Abstract class: Là khuôn mẫu cho các class.

- Interface: Là khuôn mẫu cho các phương thức(không bao gồm thuộc tính).

- Trait: Là cơ chế sử dụng lại mã trong các ngôn ngữ đơn kế thừa mà PHP là một trường hợp trong số đó.

 

Class trong PHP

Class trong PHP sẽ có thể bao gồm các thuộc tính và các phương thức.

Để khởi tạo class trong PHP, chúng ta sử dụng cú pháp như ví dụ sau:

class Person{
    public $name = "nguyen nam";
    public function getName(){
        return $this->name;
    }
}

 

Trong đó:

- class là từ khóa khởi tạo class trong PHP.

- public là phạm vi của thuộc tính / phương thức trong class. Ngoài ra, còn có private, protected. Mặc định phạm vi này sẽ là protected.

 

Lưu ý: 

- Tên class nên đặt theo chuẩn Pascal case (viết hoa chữ cái đầu của tất cả từ).

- Tên biến đặt theo quy tắc tên biến thông thường với chuẩn camelCase (viết hoa chữ cái đầu của các từ thứ 2 trở lên).

- Tên phương đặt theo quy tắc tên phương thức thông thường với chuẩn camelCase (viết hoa chữ cái đầu của các từ thứ 2 trở lên)

 

Object trong PHP

Object là các đối tượng cụ thể được tạo nên từ class. Như vậy nếu hai đối tượng cùng tạo nên từ chung một class thì sẽ có các thuộc tính và phương thức giống nhau về mặt số lượng, có thể khác nhau về giá trị.

Để tạo một object từ class nào đó, chúng ta có thể sử dụng cú pháp như ví dụ sau:

class Person{
    public $name = "nguyen nam";
    public function getName(){
        return $this->name;
    }
}
// Tạo đối tượng nguoi1 từ class Person
$nguoi1 = new Person();

// Tạo đối tượng nguoi2 từ class Person
$nguoi2 = new Person();

 

Trong đó:

- new là từ khóa dùng để tạo mới một đối tượng từ class.

 

Chúng ta có thể nhận thấy rằng, cú pháp sau từ khóa new thì khá giống cú pháp gọi hàm. Thật vậy, đó chính là cú pháp gọi hàm, mà hàm được gọi ở đây chính là hàm khởi tạo của class tương ứng, với tên hàm được đặt mặc định là __construct. Nói một cách dễ hiểu hơn là khi bạn gọi cú pháp new ABC(...params) thì chúng ta sẽ nhận được một đối tượng từ class ABC, đồng thời hàm __construct bên trong class ABC sẽ được chạy, với các tham số là ...params.

Hãy cùng xem ví dụ sau:

class Person{
    public $name;
    public $age;
    public function __construct($name = "", $age = 0) {
        $this->name = $name;
        $this->age = $age;
    }
    public function getName(){
        return $this->name;
    }
    public function getAge(){
        return $this->age;
    }
}
// Tạo đối tượng nguoi1 từ class Person, không truyền giá trị cho hàm khởi tạo.
$nguoi1 = new Person();
var_dump($nguoi1); // Kết quả: object(Person)#1 (2) { ["name"]=> string(0) "" ["age"]=> int(0) }

// Tạo đối tượng nguoi2 từ class Person, truyền đối số cho hàm khởi tạo.
$nguoi2 = new Person("Nguyễn Nam", 27);
var_dump($nguoi2); // kết quả: object(Person)#2 (2) { ["name"]=> string(12) "Nguyễn Nam" ["age"]=> int(27) }

 

Trong đó: 

- $this là đối tượng hiện tại của chúng ta.

 

Lưu ý: Phạm vi của hàm __construct phải là public nhé (không phải là private hay protected). Hoặc, bạn có thể không cần khai báo phạm vị của hàm __construct, khi này phạm vi của hàm sẽ được đặt mặc định là public.

 

Abstract class trong PHP

Liên quan đến hai tính trừu tượng và kế thừa mà chúng ta đã vừa đề cập ở trên. Chúng ta sẽ tạo abstract class A như một khuôn mẫu (hay một ràng buộc), và để cho class B kế thừa từ class A. Mục đích của việc này là ép buộc class B phải có các thuộc tính và phương thức trong class A, đồng thời chỉ định rõ ràng cách triển khai các phương thức trừu tượng mà class A chưa chỉ định cách triển khai.

Như vậy, chúng ta có thể hiểu abstract class là khuôn mẫu để tạo class (không phải khuôn mẫu để tạo đối tượng).

Hãy cùng xem về ví dụ tạo và sử dụng abstract class trong PHP như sau:

abstract class Person{
    public $name;
    public $age;
    
    abstract public function introduction();
}

class HocSinh extends Person{
    public function __construct($name = "", $age = 0) {
        $this->name = $name;
        $this->age = $age;
    }
    public function introduction(){
        return $this->name. ", " . $this->age . " tuổi";
    }
}

$hs1 = new HocSinh("Nguyễn Nam", 27);
echo $hs1->introduction(); // Kết quả: Nguyễn Nam, 27 tuổi

 

Trong đó:

- abstract là từ khóa tạo class và phương thức trừu tượng.

- extends là từ khóa để cho phép kế thừa class. class B extends A có nghĩa là class A kế thừa từ class B

 

Lưu ý: 

- Trong abstract class, chỉ có phương thức trừu tượng, không có thuộc tính trừu tượng. Ngoài phương thức trừu tượng, chúng ta có thể khai báo các thuộc tính và các phương thức không trừu tượng như thông thường (chỉ định rõ cách tiến hành của phương thức).

- Các abstract class, không được chỉ định cách tiến hành của các phương thức trừu tượng, chúng ta chỉ được khai báo tên phương thức và các tham số đầu vào nếu có.

- Class B kế thừa từ một abstract class A, thì class B phải chỉ định rõ cách tiến hành của tất cả phương thức trừu tượng mà class A đã khai báo. Và, ngoài việc có các thuộc tính và phương thức mà class A đã khai báo, thì class B có thể tạo thêm các thuộc tính và phương thức khác.

- Phạm vi của các phương thức trừu tượng trong một abstract class thì phải là public hoặc protected. Vì các phương thức trừu tượng trong abstract class sẽ được truy cập trong class kế thừa nhằm mục đích chỉ định cách tiến hành cụ thể của phương thức đó.

- Class B bất kỳ không được phép kế thừa từ nhiều abstract class. Và thậm chí là không được kế thừa từ nhiều class.

 

Interface trong PHP

Nói một cách dễ hiểu thì interface sẽ là khuôn mẫu để chỉ định các phương thức mà lớp khác sẽ triển khai.

Chúng ta có thể tạo và sử dụng interface như trong ví dụ sau:

interface DongVat {

    public function echo();
}

class Meo implements DongVat {

    public function echo() {
        echo "Meo meo";
    }

}

$animal = new Meo();
$animal->echo();

 

Trong đó:

- interface là từ khóa tạo interface.

- implements là từ khóa cho phép một class sử dụng interface đã tạo.

 

Lưu ý:

- Trong interface, chúng ta chỉ có thể chỉ định các phương thức và các hằng, không thể khai báo biến.

- Tất cả các phương thức trong interface đều là phương thức trừu tượng, và chúng ta không cần thêm từ khóa abstract trước mỗi phương thức, đồng thời chúng ta không được chỉ định cách tiến hành cho các phương thức này.

- Tất cả các phương thức trong interface đều phải có phạm vi là public. Bạn có thể không cần khai báo phạm vi, và khi này phạm vi của phương thức sẽ được hiểu là public.

- Một class C nào đó thì có thể vừa sử dụng interface B và đồng thời kế thừa từ abstract class A.

- Một class có thể sử dụng nhiều interface.

- Một interface có thể kế thừa từ một interface khác.

 

Trait trong PHP

Trait có thể giúp chúng ta tạo ra các phương thức để sử dụng trong nhiều class khác mà không cần phải kế thừa. Điều này là một tiện ích khá tốt, vì khi kế thừa, ta đang hiểu như một hệ phân cấp theo logic vậy. Còn sử dụng trait thì ta hiểu rằng chỉ đơn thuần là sử dụng lại các đoạn mã nào đó.

Xét ví dụ về khai báo và sử dụng trait như sau:

trait T1{
    public $name;
    public function getName(){
        return $this->name;
    }
    abstract public function introduction();
}
class C1{
    use t1;
    public function __construct($name) {
        $this->name = $name;
    }
    public function introduction() {
        echo "I am " . $this->getName();
    }
}

$o1 = new C1("Nguyễn Nam");
echo $o1->getName(); // Kết quả: Nguyễn Nam
$o1->introduction(); // Kết quả: I am Nguyễn Nam

 

Trong đó: 

- trait là từ khóa để tạo trait.

- use để sử dụng trait trong các class cụ thể.

 

Lưu ý:

- Chúng ta có thể khai báo các thuộc tính và phương thức trong trait. Các phương thức thì có thể là trừu tượng hoặc không, nếu là phương thức trừu tượng thì phải có từ khóa abstract đi kèm.

- Một class có thể sử dụng nhiều trait khác nhau.

- Trong trait, các thuộc tính và phương thức không trừu tượng thì có thể có bất kỳ phạm vi truy cập nào (private, protected, public). Các phương thức trừu tượng chỉ được có phạm vi truy cập là public hoặc protected.

 

Tạo vào 04/03/2023, Cập nhật 1 năm trước

Bình luận

Hãy là nguời đầu tiên bình luận về Lập trình hướng đối tượng trong PHP

Bài viết có vấn đề ? Hãy cho chúng tôi biết.

Gửi báo cáo sai phạm
Bạn đang đọc bài viết Lập trình hướng đối tượng trong PHP

Hãy để nguồn Suta.media khi phát hành lại nội dung này !