- 将标题从"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