Khái niệm cơ bản trong lập trình hướng đối tượng (OOP) PHP mà bạn cần phải biết

1. Lớp (Class)

Định nghĩa: Lớp là một mẫu (template) để tạo ra các đối tượng. Nó định nghĩa các thuộc tính và phương thức mà đối tượng sẽ có.

Ứng dụng: Lớp được sử dụng để tổ chức mã và nhóm các thuộc tính và phương thức liên quan lại với nhau.

Trường hợp sử dụng: Khi bạn cần tổ chức và nhóm các thuộc tính và hành vi liên quan lại với nhau, bạn nên tạo một lớp. Ví dụ, trong một ứng dụng quản lý xe, bạn có thể có lớp Car để quản lý thông tin về xe.

class Car {
    public $color;
    public $model;

    public function drive() {
        echo "Driving the car.";
    }
}

2. Đối tượng (Object)

Định nghĩa: Đối tượng là một thể hiện cụ thể của một lớp. Khi bạn tạo một đối tượng từ một lớp, bạn có thể sử dụng các thuộc tính và phương thức của lớp đó.

Ứng dụng: Đối tượng cho phép bạn tạo ra nhiều bản sao của một lớp với các giá trị thuộc tính khác nhau.

Trường hợp sử dụng: Khi bạn muốn tạo nhiều bản sao của một lớp với các giá trị thuộc tính khác nhau. Ví dụ, bạn có thể tạo nhiều đối tượng Car với các tên và mẫu khác nhau.

$myCar = new Car();
$myCar->color = "red";
$myCar->model = "Toyota";
$card1 = new Car("Toyota", "Black");
$card2 = new Car("Vinfas", "Blue");

3. Thuộc tính (Property)

Định nghĩa: Thuộc tính là các biến bên trong lớp, được sử dụng để lưu trữ thông tin về đối tượng.

Ứng dụng: Thuộc tính cho phép bạn lưu trữ trạng thái của một đối tượng.

Trường hợp sử dụng: Thuộc tính được sử dụng để lưu trữ trạng thái của đối tượng. Ví dụ, trong lớp Car, các thuộc tính như colormodel sẽ lưu thông tin về màu sắc và kiểu dáng của xe.

class Car {
    public $color;
    public $model;
}

4. Phương thức (Method)

Định nghĩa: Phương thức là các hàm bên trong lớp, được sử dụng để thực hiện các hành động hoặc thao tác trên thuộc tính của đối tượng.

Ứng dụng: Phương thức cho phép bạn định nghĩa các hành động mà một đối tượng có thể thực hiện.

Trường hợp sử dụng: Phương thức được sử dụng để định nghĩa các hành động mà một đối tượng có thể thực hiện. Ví dụ, bạn có thể có phương thức drive() trong lớp Car để mô tả hành động lái xe.

class Car {
    public function drive() {
        echo "Driving the car.";
    }
}

5. Kế thừa (Inheritance)

Định nghĩa: Kế thừa là một cơ chế cho phép một lớp (lớp con) kế thừa các thuộc tính và phương thức từ một lớp khác (lớp cha).

Ứng dụng: Kế thừa giúp tái sử dụng mã và giảm thiểu việc lặp lại. Ví dụ, bạn có thể có một lớp ElectricCar kế thừa từ lớp Car, để sử dụng lại các thuộc tính và phương thức của Car, đồng thời thêm các thuộc tính riêng cho ElectricCar.

Trường hợp sử dụng: Kế thừa được sử dụng khi bạn có nhiều lớp có thuộc tính và phương thức chung. Ví dụ, bạn có thể tạo lớp ElectricCar kế thừa từ lớp Car để sử dụng lại các thuộc tính và phương thức của Car, đồng thời thêm các thuộc tính riêng cho ElectricCar.

class ElectricCar extends Car {
    public $batteryLife;

    public function __construct($color, $model, $batteryLife) {
        parent::__construct($color, $model);
        $this->batteryLife = $batteryLife;
    }
}

6. Đóng gói (Encapsulation)

Định nghĩa: Đóng gói là nguyên tắc cho phép bạn ẩn thông tin và chỉ cung cấp giao diện công khai để truy cập và thay đổi dữ liệu.

Ứng dụng: Đóng gói giúp bảo vệ dữ liệu và giảm thiểu rủi ro khi dữ liệu bị thay đổi từ bên ngoài.

Trường hợp sử dụng: Đóng gói được sử dụng để bảo vệ dữ liệu và giảm thiểu rủi ro khi dữ liệu bị thay đổi từ bên ngoài. Ví dụ, bạn có thể tạo một lớp Person với các thuộc tính riêng tư để bảo vệ thông tin cá nhân.

class Person {
    private $name;

    public function setName($name) {
        $this->name = $name;
    }

    public function getName() {
        return $this->name;
    }
}

7. Đa hình (Polymorphism)

Định nghĩa: Đa hình là khả năng sử dụng một phương thức trong nhiều lớp khác nhau, thường thông qua việc định nghĩa phương thức với cùng tên nhưng với nội dung khác nhau.

Ứng dụng: Đa hình cho phép bạn xử lý các đối tượng khác nhau mà không cần biết chính xác loại đối tượng đó.

Trường hợp sử dụng: Đa hình cho phép bạn xử lý các đối tượng khác nhau mà không cần biết chính xác loại đối tượng đó. Ví dụ, bạn có thể định nghĩa một phương thức sound() trong nhiều lớp khác nhau (như DogCat) nhưng mỗi lớp có cách triển khai riêng.

class Animal {
    public function sound() {
        return "Some sound";
    }
}

class Dog extends Animal {
    public function sound() {
        return "Bark";
    }
}

class Cat extends Animal {
    public function sound() {
        return "Meow";
    }
}

8. Tính kế thừa đa cấp (Multilevel Inheritance)

Định nghĩa: Tính kế thừa đa cấp là một kiểu kế thừa trong đó một lớp con kế thừa từ một lớp cha, và lớp con này lại có thể trở thành lớp cha cho một lớp khác.

Ứng dụng: Giúp xây dựng cấu trúc lớp phức tạp hơn và quản lý mã dễ dàng hơn.

Trường hợp sử dụng: Giao diện được sử dụng để định nghĩa một tập hợp các phương thức mà các lớp khác có thể triển khai. Điều này hữu ích khi bạn cần đảm bảo rằng các lớp khác nhau thực hiện cùng một hành động.

class Vehicle {
    // properties and methods
}

class Car extends Vehicle {
    // properties and methods
}

class ElectricCar extends Car {
    // properties and methods
}

9. Tính kế thừa nhiều lớp (Multiple Inheritance)

Định nghĩa: Tính kế thừa nhiều lớp là khả năng một lớp kế thừa từ nhiều lớp khác. PHP không hỗ trợ kế thừa nhiều lớp trực tiếp, nhưng có thể sử dụng giao diện (interfaces) để đạt được điều này.

Ứng dụng: Giúp các lớp có thể kế thừa chức năng từ nhiều nguồn khác nhau.

interface CanFly {
    public function fly();
}

interface CanSwim {
    public function swim();
}

class Duck implements CanFly, CanSwim {
    public function fly() {
        echo "Flying";
    }
    
    public function swim() {
        echo "Swimming";
    }
}

10. Giao diện (Interface)

Định nghĩa: Giao diện là một tập hợp các phương thức mà một lớp phải thực hiện. Giao diện không chứa bất kỳ logic nào, chỉ định nghĩa các phương thức.

Ứng dụng: Giao diện giúp định nghĩa các hành động mà một lớp phải thực hiện mà không cần phải chỉ rõ cách thực hiện.

Trường hợp sử dụng: Giao diện được sử dụng để định nghĩa một tập hợp các phương thức mà các lớp khác có thể triển khai. Điều này hữu ích khi bạn cần đảm bảo rằng các lớp khác nhau thực hiện cùng một hành động.

interface Shape {
public function area();
}

class Rectangle implements Shape {
public function area() {
return "Calculating area of rectangle";
}
}

11. Trừu tượng (Abstraction)

Định nghĩa: Trừu tượng là quá trình ẩn đi các chi tiết phức tạp và chỉ hiển thị những thông tin cần thiết. PHP hỗ trợ trừu tượng thông qua các lớp trừu tượng (abstract classes).

Ứng dụng: Giúp giảm độ phức tạp của mã và tăng khả năng mở rộng.

Trường hợp sử dụng: Trừu tượng được sử dụng để tạo ra các lớp trừu tượng mà không cần định nghĩa tất cả các phương thức, buộc các lớp con phải cài đặt các phương thức cụ thể.

abstract class Animal {
    abstract public function sound();
}

class Dog extends Animal {
    public function sound() {
        return "Bark";
    }
}

12. Các mức truy cập (Access Modifiers)

Định nghĩa: Các mức truy cập xác định khả năng truy cập thuộc tính và phương thức của lớp từ các lớp khác. Có ba mức truy cập chính: public, private, và protected.

  • public: Có thể truy cập từ bất cứ đâu.
  • private: Chỉ có thể truy cập từ trong lớp đó.
  • protected: Có thể truy cập từ trong lớp và các lớp kế thừa.
class Example {
    public $publicProperty;
    private $privateProperty;
    protected $protectedProperty;
}

13. Tính kết hợp (Composition)

Định nghĩa: Tính kết hợp là một kiểu thiết kế trong đó một đối tượng chứa các đối tượng khác như các thành phần của nó.

Ứng dụng: Tính kết hợp giúp xây dựng các đối tượng phức tạp bằng cách sử dụng các đối tượng đơn giản hơn.

class Engine {
    public function start() {
        echo "Engine starting...";
    }
}

class Car {
    private $engine;

    public function __construct() {
        $this->engine = new Engine();
    }

    public function startCar() {
        $this->engine->start();
    }
}