1. Tính Đóng Gói trong OOP – PHP

Tính Đóng Gói là gói data và function vào trong class, và kiểm soát quyền truy cập của chúng để bảo vệ trạng thái object.

Giúp không cho phép ai sửa internal state của object tuỳ tiện, sẽ dễ bảo trì khi dự án kéo dài chục năm.

PHP sử dụng 3 từ khoá là public, private, protected để quản lý truy cập.

  • Private chỉ bên trong nội hàm, không thể truy cập/thao tác thuộc tính bên ngoài class.
  • Protected như Private nhưng cho phép class con thao tác.
  • Public cho phép gọi bên ngoài class.
<?php
class BankAccount
{
    private int $balance = 10_000; //php cho phép viết 10_000 cho dễ đọc
   
    public function deposit(int $amount): void
    {
        $this->balance += $amount; 
    }

    public function withdraw(int $amount): void
    { 
        $this->balance -= $amount; 
    }

    public function getBalance(): int
    { 
        return $this->balance; 
    }
    
}

Không ai có thể set được $balance = 1_000_000_000.

2. Tính Kế Thừa trong OOP – PHP

Tính Kế Thừa là cho phép class con sử dụng lại hàm của class cha để tái sử dụng code, tránh duplicate code. Điều này cho phép tổ chức logic theo thứ bậc.

PHP sử dụng Đơn kế thừa, bằng từ khoá extends, tức là một class con, chỉ có thể kế thừa từ 1 class cha.

Có 2 cách kế thừa:

  • Override: class con chạy function của class cha, sau đó chạy tiếp logic của mình.
  • Overload: class con ghi đè lại function của class cha, có thể tự ý thêm param. (PHP không làm được)
<?php
class Father 
{
    public function gotoWork(): string
    {
        return "Đi bộ";
    }

    public function eat(): string
    {
        return "Ăn cơm";
    }
}

class Son extends Father
{
    // LỖI do không thể overload: đè hoàn toàn hàm đang có
    public function gotoWork(string $motobike): string
    {
        return "Chạy xe: ". $motobike; 
    } 

    // Hàm này override nên chạy được
    public function eat(): string
    {
         return parent::eat() . " và uống cà phê";
    }
}

3. Tính Trừu Tượng trong OOP – PHP

Nếu Tính Đóng Gói che đi chi tiết, Tính Kế Thừa chia sẻ hành vi, thì Tính Trừu Tượng để che đi sự phức tạp.

Chúng ta luôn sử dụng Tính Trừu Tượng trong các câu nói cuộc sống hằng ngày:

Lên công an phường làm căn cước công dân.

Sau này cưới vợ, rồi đẻ con.

Rõ ràng cả 2 ví dụ trên, từ “công an phường” hoặc “vợ” đều là abstract, vì chúng ta không rõ đó là ai, tên gì, ở đâu, chỉ biết được khi runtime (chạy chương trình).

Trong OOP, tính trừu tượng sử dụng từ khoá interfaceabstract

  • interface: là hợp đồng, quy định kiểu dữ liệu input, output, không nhất thiết implement.
  • abstract: là khuôn mẫu, implement sẵn một vài function, các function được đánh dấu abstract thì để class con implement.

ví dụ code cho logic Sau này cưới vợ rồi đẻ con

<?php

interface Human 
{
    public function wedding(): void;
}

abstract class Male implements Human
{
    abstract public function getWife(): string;
    
    public function wedding(): void
    {
         echo "Tôi làm đám cưới với " . $this->getWife();
    }
}

class ChiPheo extends Male
{
     public function getWife(): string
     {
         return "Thị Nở";
     }
}

$mrChiPheo = new ChiPheo();
$mrChiPheo->wedding(); // Tôi làm đám cưới với Thị Nở

4. Tính Đa Hình trong OOP – PHP

Tính Đa Hình là một đặc tính cho phép cùng một lời gọi phương thức nhưng mỗi đối tượng phản ứng theo cách khác nhau tùy vào class của nó.

Hãy xem ví dụ dưới đây:

<?php 
abstract class Shape
{
    abstract public function area(): float;
}

class Circle extends Shape 
{
    public function __construct(public float $r)
    {}
     
    public function area() 
    {
        return pi() * $this->r ** 2;
    }
}

class Square extends Shape 
{
    public function __construct(public float $w) 
    {
    }
    public function area() {
        return $this->w ** 2;
    }
}

class ShapeCollection
{
    private array $collection;

    public function add(Shape $shape)
    {
        $this->collection[] = $shape;
    }

    public function sumArea()
    {
        $sum = 0;
        foreach ($this->collection as $shape) {
            $sum += $shape->area();
        }
        return $sum;
    }
}

$collection = new ShapeCollection();
$collection->add(new Circle(1));
$collection->add(new Square(5));
echo $collection->sumArea(); // ra tổng diện tích 2 hình

Rõ ràng Tính Đa Hình cho phép việc linh hoạt mở rộng chương trình, bổ sung thêm class mới mà không cần phải sửa code cũ.

By admin