Hướng dẫn php 8 class constructor - hàm tạo lớp php 8

Trong PHP 8 property promotion cho phép bạn kết hợp các trường của class, định nghĩa hàm khởi tạo và các phép gán biến ,  tất cả thành một cú pháp trong param của hàm __construct.

Điều này giúp bạn giảm thiểu việc lặp lại code. Nó cho phép bạn kết hợp định nghĩa và khởi tạo các thuộc tính thành một câu lệnh khởi tạo duy nhất.  

Ví dụ.

Bình thường bạn sẽ viết như này

class BlogPost {
 
    protected string $title;
 
    protected string $content;
 
    protected DateTimeImmutable $postedDate;
 
 
    public function __construct(
        string $title,
        string $content,
        DateTimeImmutable $postedDate) {
 
        $this->title = $title;
        $this->content = $content;
        $this->postedDate = $postedDate;
    }
 
}

Khi áp dụng Constructor Property Promotion thì đoạn code sẽ ngắn gọn như sau: Constructor Property Promotion thì đoạn code sẽ ngắn gọn như sau: 

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}

Một số điều lưu ý:

1. Property promotion chỉ sử dụng được trong constructors.Property promotion chỉ sử dụng được trong constructors.

2. Không cho phép sử dụng trùng lặp:

VD: 

class MyClass
{
    public string $a;

    public function __construct(
        public string $a,
    ) {}
}

Bạn không thể vừa khai báo 

class MyClass
{
    public string $a;

    public function __construct(
        public string $a,
    ) {}
}
8 vừa sử dụng promoted property

3. Cho phép các thuộc tính không có kiểu dữ liệu (mixed type/untyped)

class MyDTO
{
    public function __construct(
        public $untyped,
    ) {}
}

4. Promoted properties cho phép bạn khởi tạo giá trị mặc định, tuy nhiên những biểu thức như 

class MyClass
{
    public string $a;

    public function __construct(
        public string $a,
    ) {}
}
9 thì không được phépkhông được phép

VD:

public function __construct(
    public string $name = 'Brent',
    public DateTimeImmutable $date = new DateTimeImmutable(),
) {}

5. Có thể kết hợp promoted và normal propertiespromotednormal properties

VD: 

class MyClass
{
    public string $b;

    public function __construct(
        public string $a,
        string $b,
    ) {
        $this->b = $b;
    }
}

Tuy có thể đồng thời sử dụng trong construct tuy nhiên bạn chỉ nên chọn 1 kiểu sẽ rõ ràng hơn khi đọc code nhé.

6. Cho phép bạn truy cập đến các promoted properties trong contructor body

public function __construct(
    public int $a,
    public int $b,
) {
    if ($this->a >= 100) {
        // logic here
    };

    if ($b >= 0) {
        throw new InvalidArgumentException('…');
    }
}

7. Doc comments trên promoted properties

class MyClass 
{
    public function __construct(
        /** @var string */
        public $a,
    ) {}
}

8. Không thể dùng trong abstract constructors

abstract class A
{
    // errorrrrrrrrrrrrr
    abstract public function __construct(
        public string $a,
    ) {}
}

9. Được phép dùng trong traits

trait MyTrait
{
    public function __construct(
        public string $a,
    ) {}
}

10. Không hỗ trợ 

class MyDTO
{
    public function __construct(
        public $untyped,
    ) {}
}
0

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
0

11. Variadic parameters (...$xxx) không thể dùng promoted

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
1

12 . Inheritance - kế thừa

PHP không cần phải tuân theo khai báo của parent constructor, nên có rất ít điều để nói: được phép thừa kế . Nếu bạn cần chuyển các thuộc tính từ hàm khởi tạo con sang hàm tạo cha, bạn sẽ cần chuyển chúng theo cách thủ công:được phép thừa kế . Nếu bạn cần chuyển các thuộc tính từ hàm khởi tạo con sang hàm tạo cha, bạn sẽ cần chuyển chúng theo cách thủ công:

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
2

Bài viết tham khảo từ các nguồn trên mạng và từ blog Chung Nguyễn Blog

Trong PHP 8 property promotion cho phép bạn kết hợp các trường của class, định nghĩa hàm khởi tạo và các phép gán biến -> tất cả thành một cú pháp trong param của hàm construct

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
3

Bạn có thể viết lại như thế này:

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
4

Nó hoạt động ntn

Ý tưởng cơ bản rất đơn giản: tất cả các thuộc tính của lớp và các phép gán biến và tiền tố  (public, protected, private) của các tham số của hàm khởi tạo  PHP sẽ lấy cú pháp mới đó và chuyển đổi nó thành cú pháp bình thường, trước khi thực sự thực thi mã.

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
5

Đoạn mã sau khi được chuyển đổi trước khi thực thi:

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
6

Chỉ trong constructors

chỉ có thể sử dụng trong contructors, hãy nhớ nhé.

Không cho phép trùng lặp

class MyClass
{
    public string $a;

    public function __construct(
        public string $a,
    ) {}
}

Bạn không thể vừa khai báo

class MyClass
{
    public string $a;

    public function __construct(
        public string $a,
    ) {}
}
8 vừa sử dụng promoted property

Cho phép các thuộc tính vô kiểu (mixed type/untyped)

class MyDTO
{
    public function __construct(
        public $untyped,
    ) {}
}

Simple defaults

Promoted properties cho phép bạn khởi tạo giá trị mặc định, tuy nhiên những biểu thức như

class MyClass
{
    public string $a;

    public function __construct(
        public string $a,
    ) {}
}
9 thì không được phépkhông được phép

public function __construct(
    public string $name = 'Brent',
    public DateTimeImmutable $date = new DateTimeImmutable(),
) {}

Có thể kết hợp promoted và normal properties

class MyClass
{
    public string $b;

    public function __construct(
        public string $a,
        string $b,
    ) {
        $this->b = $b;
    }
}

Tuy có thể đồng thời sử dụng trong construct tuy nhiên bạn chỉ nên chọn 1 kiểu sẽ rõ ràng hơn khi đọc code

Cho phép bạn truy cập đến các promoted properties trong contructor body

public function __construct(
    public int $a,
    public int $b,
) {
    if ($this->a >= 100) {
        // logic here
    };

    if ($b >= 0) {
        throw new InvalidArgumentException('…');
    }
}

Doc comments trên promoted properties

class MyClass 
{
    public function __construct(
        /** @var string */
        public $a,
    ) {}
}

Không thể dùng trong abstract constructorsabstract constructors

abstract class A
{
    // errorrrrrrrrrrrrr
    abstract public function __construct(
        public string $a,
    ) {}
}

Được phép dùng trong traits

trait MyTrait
{
    public function __construct(
        public string $a,
    ) {}
}

Không hỗ trợ class MyDTO { public function __construct( public $untyped, ) {} }0

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
0

Variadic parameters (...$xxx) không thể dùng promoted

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
1

Inheritance - kế thừa

PHP không cần phải tuân theo khai báo của parent constructor, nên có rất ít điều để nói: được phép thừa kế . Nếu bạn cần chuyển các thuộc tính từ hàm khởi tạo con sang hàm tạo cha, bạn sẽ cần chuyển chúng theo cách thủ công:được phép thừa kế . Nếu bạn cần chuyển các thuộc tính từ hàm khởi tạo con sang hàm tạo cha, bạn sẽ cần chuyển chúng theo cách thủ công:

class BlogPost {
    public function __construct(
        protected string $title,
        protected string $content,
        protected DateTimeImmutable $postedDate) {}
}
2

Dịch và tham khảo từ: stitcher.io

Ủng hộ Chung Nguyễn Blog

Chung Nguyễn Blog sử dụng FlashVPS - Dịch vụ quản trị máy chủ chuyên nghiệp để quản lý VPS

#FlashVPS là dịch vụ cloud panel trên nền tảng web hỗ trợ khách hàng:

  • * Quản lý máy chủ số lượng nhiều
  • * Không có kinh nghiệm quản lý máy chủ
  • * Thích sử dụng giao diện web đơn giản, trực quan hơn terminal
  • * Quá nhàm chán với việc ghi nhớ và lặp lại việc gõ các câu lệnh
  • * Muốn tự động hóa mọi thao tác
  • * Muốn tiết kiệm thời gian quản trị máy chủ
  • * Muốn tiết kiệm tiền bạc, nhân lực quản trị máy chủ
  • 👉 https://flashvps.dev

Các bài viết trên website thường xuyên được đăng tải và cập nhật trên trang Facebook Chung Nguyễn Blog hãy tặng cho Chung một LIKE nhé! Mãi yêu các bạn!LIKE nhé! Mãi yêu các bạn!

813 👍

Đánh giá bài viết

Hướng dẫn php 8 class constructor - hàm tạo lớp php 8

PHP 8: Constructor property promotion

5/5 1 votes /5 1 votes