I am passionate about adopting new technologies and thrive in dynamic environments.

Telegram

@hxdvn

Social Links

Web Development

PHP 8: Constructor property promotion

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.

PHP 8: Constructor property promotion

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;
    }
 
}

image.gif

Khi áp dụng 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) {}
}

image.gif

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

1. 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,
    ) {}
}

image.gif

Bạn không thể vừa khai báo public string $a 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ư new ... thì không được phép

VD:

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

 

5. Có thể kết hợp promotednormal 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,
    ) {}
}

image.gif

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

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

 

10. Không hỗ trợ var

public function __construct(
    var string $a, // error <-------
) {}

image.gif

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

public function __construct(
    public string ...$a, // error <-------
) {}

image.gif

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:

class A
{
    public function __construct(
        public $a,
    ) {}
}

class B extends A
{
    public function __construct(
        $a,
        public $b,    
    ) {
        parent::__construct($a);
    }
}

image.gif

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

php, Constructor property promotion, PHP 8 property, PHP 8, __construct
4 min read
Dec 06, 2024
By HXD VN
Share

Leave a comment

Your email address will not be published. Required fields are marked *

Related posts

Jan 09, 2025 • 4 min read
Đối tác cung cấp dịch vụ hosting vps tốt nhất mà tôi tin tưởng sử dụng - 123HOST

Nhớ lại cách đây khoảng 10 năm, từ những ngày đầu bắt đầu dấn thân vào...

Dec 22, 2024 • 14 min read
Bí quyết thành công cho thực tập sinh: Hành trang vững chắc cho sự nghiệp

Từ kinh nghiệm làm việc của mình, tôi nhận thấy giai đoạn thực tập đón...

Nov 29, 2024 • 7 min read
Quản Lý Giới Hạn Tốc Độ API trong Laravel thông qua Job Throttling

Khi làm việc với các dịch vụ bên ngoài như AWS SES để gửi email, việc...