[8.4] Widening property hook's type for promoted property does not work
Đang mở
Chưa có ai nhận issue này.
Feature
Status: Needs Triage
- Ngôn ngữ chính
- C
- Star
- 40.4k
- Fork
- 8.2k
- Merge trung bình
- 2 ngày 13 giờ
- Pull request đã merge (30 ngày)
- 96
Mô tả
Description
The following code:
<?php
declare(strict_types=1);
class Foo
{
public function __construct(
public int $baz { set (int|string|stdClass $value) {
if (is_int($value)) {
$this->baz = $value;
} else if ($value instanceof stdClass
&& property_exists($value, 'baz')
&& is_int($value->baz)
) {
$this->baz = $value->baz;
} else if (is_numeric($value)) {
$this->baz = (int) $value;
} else {
throw new InvalidArgumentException('Invalid value');
}
} },
) {}
}
$obj = new stdClass();
$obj->baz = 123;
var_dump(new Foo($obj));
Resulted in this output:
Fatal error: Uncaught TypeError: Foo::__construct(): Argument #1 ($baz) must be of type int, stdClass given, called in /in/2mZY5 on line 29 and defined in /in/2mZY5:7
Stack trace:
#0 /in/2mZY5(29): Foo->__construct(Object(stdClass))
#1 {main}
thrown in /in/2mZY5 on line 7
But I expect this to work instead, just like when property is not promoted.
Originally encountered when preparing Twitter thread.
PHP Version
8.4 (current master)
Operating System
No response
Hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Hướng nghiên cứu
Bắt đầu bằng cách tái hiện ví dụ về promoted property trong issue và so sánh với ví dụ về non-promoted property được liên kết ở đó. Truy vết nơi kiểu của đối số constructor được kiểm tra so với nơi property hook xử lý phép gán; được xem là hoàn tất khi trường hợp promoted chấp nhận đầu vào được mở rộng của hook như mong đợi và có một bài kiểm thử hồi quy.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- php
- Lĩnh vực
- backend
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 35/100