1. Tính trừu tượng trong hướng đối tượng PHP là gì?

Tính trừu tượng là quá trình đơn giản hóa một đối tượng, mà trong đó sẽ chỉ có những đặc điểm mà ta quan tâm và bỏ qua những thứ không cần thiết phức tạp của đối tượng và chỉ tập trung vào những thứ cốt lõi, quan trọng. 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 là quan trọng, cần thiết cho chương trình.

Ví dụ: chương trình quản lý sinh viên cần có thông tin như: họ tên, năm sinh, giới tính,… chứ không cần thiết đến thông tin như:sở thích, màu da, độ đẹp trai,…

Tính trừu tượng thì được thể hiện qua abstract class và interface mà chúng ta sẽ tìm hiểu kỹ về chúng.

2. Lớp trừu tượng và phương thức trừu tượng là gì

Lớp trừu tượng và phương thức trừu tượng là khi lớp cha có một phương thức được đặt tên nhưng cần các lớp con của nó để điền các tác vụ. Một lớp trừu tượng là một lớp mà có chứa ít nhất một phương thức trừu tượng. Một phương thức trừu tượng là phương thức được khai báo nhưng lại không được triển khai trong mã.

Một lớp trừu tượng hoặc phương thức trừu tượng thì được định nghĩa bằng từ khóa abstract.

Ví dụ:

<?php
abstract class ParentClass {
  abstract public function someMethod1();
  abstract public function someMethod2($name, $color);
  abstract public function someMethod3() : string;
}
?>

3. Kế thừa một lớp hoặc một phương thức trừu tượng

Khi kế thừa từ một lớp trừu tượng, phương thức lớp con phải cùng định nghĩa với cùng một tên và cùng một công cụ sửa đổi quyền truy cập bị hạn chế giống nhau. Vì vậy nếu phương thức trừu tượng được định nghĩa là bảo vệ, phương thức lớp con phải được định nghĩa là bảo vệ hoặc công khai, nhưng không phải là riêng tư. Ngoài ra loại và số lượng đối số bắt buộc phải giống nhau. Tuy nhiên, các lớp con có thể có các đối số tùy chọn.

Vì vậy mà khi một lớp con được kế thừa từ một lớp trừu tượng, ta có một số quy tắc sau:

  • Phương thức lớp con phải được định nghĩa với cùng tên và nó khai báo lại phương thức trừu tượng mẹ.
  • Phương thức lớp con phải được xác định với công cụ sửa đổi quyền truy cập giống hoặc ít bị hạn chế hơn
  • Số lượng đối số bắt buộc phải giống nhau. Tuy nhiên lớp con có thể có các đối số tùy chọn ngoài ra.
<?php
// Lớp cha
abstract class Car {
  public $name;
  public function __construct($name) {
    $this->name = $name;
  }
  abstract public function intro() : string;
}

// lớp con
class Audi extends Car {
  public function intro() : string {
    return "Chọn chất lượng Đức! I'm an $this->name!";
  }
}

class Volvo extends Car {
  public function intro() : string {
    return "Tự hào là người Việt I'm a $this->name!";
  }
}

class Citroen extends Car {
  public function intro() : string {
    return "Sự xa hoa của người Pháp! I'm a $this->name!";
  }
}

// Tạo đối tượng từ các lớp con
$audi = new audi("Audi");
echo $audi->intro();
echo "<br>";

$volvo = new volvo("Volvo");
echo $volvo->intro();
echo "<br>";

$citroen = new citroen("Citroen");
echo $citroen->intro();
?>

 

Ở đây lớp Audi, Volvo và Citroen được kế thừa từ lớp xe hơi. Điều này có nghĩa là các lớp đó có thể sử dụng thuộc tính public $name cũng như phương thức puclic __contruct từ lớp Car() vì tính kế thừa. Tuy nhiên intro() là một phương thức trừu tượng nên được định nghĩa trong tất cả các lớp con và chúng phải trả về một chuỗi.

4. Lớp trừu tượng abstract trong hướng đối tượng PHP

4.1. Lớp trừu tượng abstract là gì?

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

Một lớp được khai báo là abstract thì là lớp trừu tượng.

Cú pháp khai báo:

abstract visibility function methodName();

Trong đó: visibility là một trong 2 từ khóa protected hoặc public, methodName là tên của phương thức ta cần khai báo.

Ví dụ:

abstract public function getHeight()
{
    //
}

4.2. Đặc điểm khác của lớp trừu tượng abstract

Ta sẽ có một số đặ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 bên trong abstract class.
  • Các thuộc tính bên trong abstract class thì không được khai báo là abstract.
  • Không thể khởi tạo một abstract.
  • Vì không thể khởi tạo abstract nên các phương thức chỉ được khai báo ở mức độ protectedpuclic.
  • Các lớp kế thừa của một abstract class phải định nghĩa lại tất cả phương thức trong abstract class đó nếu không sẽ bị lỗi.

Cú pháp khai báo abstract class:

abstract class ClassName
{
    // class body
}

Ví dụ:

abstract class Person
{
    // đúng
    //khai báo một phương thức
    protected function getName()
    {
        //code
    }
}

4.3. Các ví dụ cụ thể

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

abstract class Person
{
    //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: không thể khai báo một abstract trong class bình thường

class People
{
    //sai vì không thể khai báo một phương thức absract trong class bình thường.
    abstract public function getA();
}

Ví dụ3: trong abstract class thuộc tính không được khai báo với từ khóa abstract

{
    //sai
    abstract public $name;
    //đúng
    public $name;
}

Ví dụ4: không thể khởi tạo một abstract class

abstract class Person
{
    //body
}
//Sai
$person= new Person();

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

abstract class Dongvat
{
    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 ConTrau extends Dongvat
{
    //
}

//class này đúng vì đã định nghĩa lại đầy đủ các phương thức abstract
class ConBo extends Dongvat
{
    public function getName()
    {
        return $this->name;
    }
}

4.4. Vai tròn của abstract class trong PHP

Trong lập trình, khai bạn hoặc một người nào đó xây dựng một hệ thống website, và trong quá trình xây dựng hệ thống, bạn muốn ép người lập trình phải tuân thủ theo một số các phương thức và các phương thức này đã được định nghĩa sẵn những thứ cơ bản, để giúp lập trình viên có thể kế thừa các phương thức này và phát triển lớp con của nó.