- 在 AssignOpTrait 中添加对静态属性赋值的支持 - 扩展 CompilerBase 以实现静态属性类型检测和赋值验证 - 添加 assertCanAssignStaticProp 方法进行静态属性赋值检查 - 重构静态属性本地槽位生成逻辑,支持不同数据类型 - 为对象属性提升优化添加安全检查机制 - 新增测试用例验证静态属性原生类型默认值功能 - 更新函数上下文文档注释以反映静态属性槽位映射变化pull/1/head
parent
4ff12b58d1
commit
feb5041d2e
6 changed files with 180 additions and 17 deletions
@ -0,0 +1,31 @@ |
|||||||
|
--TEST-- |
||||||
|
SSA object prop: this object argument escape prevents property hoisting |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
use native_types; |
||||||
|
|
||||||
|
class Foo { |
||||||
|
public int $a; |
||||||
|
|
||||||
|
public function run(): void { |
||||||
|
$this->a = 1; |
||||||
|
|
||||||
|
$fn = 'make_ref'; |
||||||
|
$fn($this); |
||||||
|
$this->a += 1; |
||||||
|
|
||||||
|
var_dump($this->a); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function make_ref(Foo $o): void { |
||||||
|
$ref =& $o->a; |
||||||
|
$ref = 99; |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void { |
||||||
|
(new Foo())->run(); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(100) |
||||||
@ -0,0 +1,53 @@ |
|||||||
|
--TEST-- |
||||||
|
Static properties with native_types keep defaults and local slots |
||||||
|
--FILE-- |
||||||
|
<?php |
||||||
|
use native_types; |
||||||
|
|
||||||
|
class StaticNativeDefaults { |
||||||
|
public static int $i = 42; |
||||||
|
public static float $f = 3.5; |
||||||
|
public static bool $b = true; |
||||||
|
public static string $s = "seed"; |
||||||
|
public static array $a = [1, 2]; |
||||||
|
} |
||||||
|
|
||||||
|
function main(): void { |
||||||
|
var_dump(StaticNativeDefaults::$i); |
||||||
|
var_dump(StaticNativeDefaults::$f); |
||||||
|
var_dump(StaticNativeDefaults::$b); |
||||||
|
var_dump(StaticNativeDefaults::$s); |
||||||
|
var_dump(StaticNativeDefaults::$a); |
||||||
|
|
||||||
|
StaticNativeDefaults::$i = 100; |
||||||
|
StaticNativeDefaults::$f = 2.25; |
||||||
|
StaticNativeDefaults::$b = false; |
||||||
|
StaticNativeDefaults::$s = "changed"; |
||||||
|
StaticNativeDefaults::$a = [9]; |
||||||
|
|
||||||
|
var_dump(StaticNativeDefaults::$i); |
||||||
|
var_dump(StaticNativeDefaults::$f); |
||||||
|
var_dump(StaticNativeDefaults::$b); |
||||||
|
var_dump(StaticNativeDefaults::$s); |
||||||
|
var_dump(StaticNativeDefaults::$a); |
||||||
|
} |
||||||
|
?> |
||||||
|
--EXPECT-- |
||||||
|
int(42) |
||||||
|
float(3.5) |
||||||
|
bool(true) |
||||||
|
string(4) "seed" |
||||||
|
array(2) { |
||||||
|
[0]=> |
||||||
|
int(1) |
||||||
|
[1]=> |
||||||
|
int(2) |
||||||
|
} |
||||||
|
int(100) |
||||||
|
float(2.25) |
||||||
|
bool(false) |
||||||
|
string(7) "changed" |
||||||
|
array(1) { |
||||||
|
[0]=> |
||||||
|
int(9) |
||||||
|
} |
||||||
Loading…
Reference in new issue