algolia search

Tìm thấy x bài viết trong xms.

PHP 8: Constructor property promotion

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

// Trước khi dùngPHP 8: Constructor property promotion

class CustomerDTO
{
    public string $name;

    public string $email;

    public DateTimeImmutable $birth_date;

    public function __construct(
        string $name, 
        string $email, 
        DateTimeImmutable $birth_date
    ) {
        $this->name = $name;
        $this->email = $email;
        $this->birth_date = $birth_date;
    }
}

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

class CustomerDTO
{
    public function __construct(
        public string $name, 
        public string $email, 
        public DateTimeImmutable $birth_date,
    ) {}
}

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ã.

// Đoạn mã khi viết

class MyDTO
{
    public function __construct(
        public string $name = 'Brent',
    ) {}
}

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

class MyDTO
{
    public string $name;

    public function __construct(
        string $name = 'Brent'
    ) {
        $this->name = $name;
    }
}

Promoted property properties

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 public string $a 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ư new ... thì khô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 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ợ var

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

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

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

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

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

Đánh giá bài viết

Thích thì like
PHP 8: Constructor property promotion
5/5 1 votes

Bình luận

Hiển thị bình luận Facebook