PHP 8.6: cached static closure keeps `static::` of the first called class
维护者通常 1 天内回复
@iluuu1994 已经在做这个了。
开始于 2026年9月26日。
评估
调研方向
Start by running the supplied PHP reproducer with and without opcache, then compare the behavior around the bisected commit f47cd216e9537301471d6af770998fe5fe5c784c. Inspect the ZEND_DECLARE_LAMBDA_FUNCTION path and cached static-closure behavior, then verify that B::name() and C::name() return their respective class names, including the reported inherited-method variants.
由索引模型根据 Issue 内容生成。
描述
Description
The following code:
<?php
class A {
public static function name(): string {
return (static fn () => static::class)();
}
}
class B extends A {}
class C extends A {}
var_dump(B::name(), C::name());
Resulted in this output:
string(1) "B"
string(1) "B"
But I expected this output instead:
string(1) "B"
string(1) "C"
8.4 and 8.5 give the expected output. 8.6.0RC2 does not, with or without opcache.
Bisected to f47cd216e9537301471d6af770998fe5fe5c784c (#23203). Its parent 969a50d9957bf6806452ae3f3434c6a30369cc1f gives "B", "C". Still reproduces on PHP-8.6 7f5658403c5afa1dd929768b4f5a5cc06ddb8a24 and master 69ca307e1d482c7959b22d594852264ee179fe45.
Cc @iluuu1994
Written with LLM assistance, per CONTRIBUTING.md. The code, outputs and bisect above are measured.
It also happens in inherited instance methods, and with
new static()andget_called_class(). A non-static closure is fine. We hit it inbensampo/laravel-enum, where the second enum class gets instances of the first.Unverified guess:
ZEND_DECLARE_LAMBDA_FUNCTIONreturns the cached closure without checking the called scope, and all subclasses share the slot in the declaring op_array.
PHP Version
PHP 8.6.0RC2 (cli) (built: Sep 24 2026 20:13:06) (NTS clang 15.0.0)
Copyright © The PHP Group and Contributors
Built by Laravel Herd
Zend Engine v4.6.0RC2, Copyright © Zend by Perforce
with Zend OPcache v8.6.0RC2, Copyright ©, by Zend by Perforce
Operating System
macOS 26.6.2 (arm64)
- 主要语言
- C
- 星标
- 40.4k
- 派生
- 8.2k
- 平均合并
- 2 天 9 小时
- 30 天内合并 PR
- 122
环境准备
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
php/php-src 的其他 Issue
-
难度 2/5 1-3 小时 新手友好度 72/100
维护者通常 1 天内回复
-
Bug Status: Needs Triage
难度 2/5 1-3 小时 新手友好度 76/100
维护者通常 1 天内回复
-
Bug Status: Needs Triage
难度 1/5 1 小时以内 新手友好度 90/100
维护者通常 1 天内回复
-
Bug Status: Needs Triage
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
Bug Category: Tests Status: Verified
难度 2/5 1-3 小时 新手友好度 68/100
维护者通常 1 天内回复
相似的 Issue
-
难度 2/5 1-3 小时 新手友好度 85/100
microsoft/ebpf-for-windows#5604 ·
维护者通常 3 天内回复
-
难度 2/5 1-3 小时 新手友好度 84/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
维护者通常 1 天内回复
-
难度 1/5 1 小时以内 新手友好度 84/100
AcademySoftwareFoundation/openexr#2683 ·
维护者通常 1 天内回复