- 将标题从"AOT编译器原生类型支持说明"改为"AOT编译器类型系统说明" - 新增高精度数值类型支持(bigInteger、decimal、bigFloat) - 更新类型映射表,增加底层实现列和新类型条目 - 完善二元运算类型提升规则文档,包括Var主导规则、Float优先规则、大数类型精度提升规则 - 添加类型提升完整矩阵表格便于查阅 - 更新复合赋值运算符类型转换说明 - 将最后更新日期更新至2026年5月26日pull/1/head
parent
ee30acc94e
commit
f33641aead
7 changed files with 266 additions and 22 deletions
@ -0,0 +1,6 @@ |
||||
<?php |
||||
function main() |
||||
{ |
||||
$a = [1, 2, 3]; |
||||
$a .= "hello"; |
||||
} |
||||
@ -0,0 +1,5 @@ |
||||
<?php |
||||
function main() |
||||
{ |
||||
$undefinedVar += 5; |
||||
} |
||||
@ -0,0 +1,14 @@ |
||||
<?php |
||||
|
||||
class AssignOpTest extends \BaseTest |
||||
{ |
||||
public function testAssignOpUndefinedVar() |
||||
{ |
||||
$this->exec('Cannot assign to undefined variable', 'assign-op-undefined-var.php'); |
||||
} |
||||
|
||||
public function testConcatToArray() |
||||
{ |
||||
$this->exec('Cannot concat string to array', 'assign-op-concat-array.php'); |
||||
} |
||||
} |
||||
@ -0,0 +1,121 @@ |
||||
--TEST-- |
||||
Compound assignment operators with mixed Var/native types |
||||
--FILE-- |
||||
<?php |
||||
|
||||
function main() { |
||||
// ===== Var += various RHS types ===== |
||||
// Var += Int (no native types — Var operator should handle coercion) |
||||
$a = 10; |
||||
$a += 5; |
||||
var_dump($a); |
||||
|
||||
// Var += Float |
||||
$b = 10; |
||||
$b += 2.5; |
||||
var_dump($b); |
||||
|
||||
// Var += String (numeric) |
||||
$c = 10; |
||||
$c += "5.5"; |
||||
var_dump($c); |
||||
|
||||
// Var -= Int |
||||
$d = 10; |
||||
$d -= 3; |
||||
var_dump($d); |
||||
|
||||
// Var *= Float |
||||
$e = 10; |
||||
$e *= 2.5; |
||||
var_dump($e); |
||||
|
||||
// Var /= Int (integer division → float in PHP) |
||||
$f = 10; |
||||
$f /= 3; |
||||
var_dump($f); |
||||
|
||||
// Var %= Int |
||||
$g = 10; |
||||
$g %= 3; |
||||
var_dump($g); |
||||
|
||||
// ===== With use native_types ===== |
||||
// Int += Int |
||||
$h = std::int(100); |
||||
$h += 50; |
||||
var_dump($h); |
||||
|
||||
// Int += Float (native types: truncates) |
||||
$i = std::int(100); |
||||
$i += 3.7; |
||||
var_dump($i); |
||||
|
||||
// Float += Int |
||||
$j = std::float(10.5); |
||||
$j += 5; |
||||
var_dump($j); |
||||
|
||||
// Float += Float |
||||
$k = std::float(10.5); |
||||
$k += 3.25; |
||||
var_dump($k); |
||||
|
||||
// Int -= Float |
||||
$l = std::int(10); |
||||
$l -= 3.5; |
||||
var_dump($l); |
||||
|
||||
// Float -= Int |
||||
$m = std::float(10.0); |
||||
$m -= 3; |
||||
var_dump($m); |
||||
|
||||
// Int *= Float |
||||
$n = std::int(5); |
||||
$n *= 2.5; |
||||
var_dump($n); |
||||
|
||||
// Float *= Int |
||||
$o = std::float(3.0); |
||||
$o *= 4; |
||||
var_dump($o); |
||||
|
||||
// Int /= Int (native Int / Int → Int truncation) |
||||
$p = std::int(10); |
||||
$p /= 3; |
||||
var_dump($p); |
||||
|
||||
// Float /= Int |
||||
$q = std::float(10.0); |
||||
$q /= 3; |
||||
var_dump($q); |
||||
|
||||
// Int %= Int |
||||
$r = std::int(10); |
||||
$r %= 3; |
||||
var_dump($r); |
||||
|
||||
echo "done\n"; |
||||
} |
||||
?> |
||||
--EXPECT-- |
||||
int(15) |
||||
float(12.5) |
||||
float(15.5) |
||||
int(7) |
||||
float(25) |
||||
float(3.3333333333333335) |
||||
int(1) |
||||
int(150) |
||||
int(103) |
||||
float(15.5) |
||||
float(13.75) |
||||
int(6) |
||||
float(7) |
||||
int(12) |
||||
float(12) |
||||
int(3) |
||||
float(3.3333333333333335) |
||||
int(1) |
||||
done |
||||
Loading…
Reference in new issue