Fatal error: class and trait define the same constant in the composition of child class in case constant in trait is equal to constant in child class
Chưa có ai nhận issue này.
- Ngôn ngữ chính
- C
- Star
- 40.4k
- Fork
- 8.1k
- Merge trung bình
- 2 ngày 13 giờ
- Pull request đã merge (30 ngày)
- 96
Mô tả
Description
The following code:
<?php
trait T {
public const a = C2::b;
}
class C1 {
use T;
const b = 1;
}
class C2 extends C1 {
use T;
const b = 2;
}
echo C1::a;
echo C2::a;
Resulted in this output:
Fatal error: C1 and T define the same constant (a) in the composition of C2. However, the definition differs and is considered incompatible. Class was composed in /in/riAnX on line 9
But I expected this output instead:
22
It's not clear to me why this code is incorrect, but at the same time, the following works:
<?php
trait T {
public const a = self::b;
}
class C1 {
use T;
const b = 1;
}
class C2 extends C1 {
use T;
const b = 2;
}
echo C1::a;
echo C2::a;
and outputs
11
PHP Version
8.2
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
Không có tệp nguồn hoặc bài kiểm thử nào được nêu tên. Hãy bắt đầu bằng cách chạy reproducer được cung cấp cho PHP 8.2 và so sánh hằng số của trait sử dụng C2::b với biến thể self::b; lần theo quá trình kết hợp hằng số của trait/lớp để xác lập quy tắc dự kiến. Được xem là hoàn tất khi ví dụ đầu tiên tuân theo hành vi phân giải hằng số dự kiến mà không phát sinh lỗi fatal không chính xác, kèm theo phạm vi 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