[8.4] Widening property hook's type for promoted property does not work
未关闭
还没有人认领这个 Issue。
Feature
Status: Needs Triage
- 主要语言
- C
- 星标
- 40.4k
- 派生
- 8.2k
- 平均合并
- 2 天 13 小时
- 30 天内合并 PR
- 96
描述
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
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先复现 issue 中的 promoted property 示例,并将其与其中链接的 non-promoted property 示例进行比较。追踪构造函数参数在哪里进行类型检查,以及 property hook 在哪里处理赋值;当 promoted 情况按预期接受扩展后的 hook 输入,并且有一个回归测试时,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- php
- 领域
- backend
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100