fix(php): 修复数组赋值表达式中的变量检测和返回值处理

- 修复了数组项解析时的变量作用域问题
- 添加了赋值表达式状态的临时保存和恢复机制
- 改进了变量表达式的类型检查逻辑
- 修复了void类型函数的返回值处理
- 确保非void类型的函数返回正确的空值表示
pull/1/head
韩天峰 7 months ago
parent 2acc84659a
commit 548f7ce496
  1. 9
      src/Php/CompilerBase.php
  2. 2
      tests/misc/1.phpt
  3. 2
      tests/misc/2.phpt
  4. 37
      tests/misc/3.phpt

@ -1036,8 +1036,11 @@ class CompilerBase extends \PhpAot\Core\Translator
continue;
}
if ($item instanceof Node\Expr\ArrayItem) {
$oriInAssignExpr = $this->inAssignExpr;
$this->inAssignExpr = true;
$var = $this->parseIdentifier($item->value);
if (!$this->hasVar($var)) {
$this->inAssignExpr = $oriInAssignExpr;
if ($this->isVarExpr($item->value) and !$this->hasVar($var)) {
$this->addLocalVar($var, self::TYPE_VAR);
}
$code .= "{$var} = {$tmpVar}.item({$k}); ";
@ -1199,7 +1202,11 @@ class CompilerBase extends \PhpAot\Core\Translator
protected function parseReturn(mixed $v): string
{
if ($v->expr === null) {
if ($this->functionDef->returnType === self::TYPE_VOID) {
return 'return;';
} else {
return 'return php::null;';
}
}
// 实际函数的返回值
$type = $this->detectExprType($v->expr);

@ -1,5 +1,5 @@
--TEST--
mixed/1.phpt
mixed: 1
--FILE--
<?php

@ -1,5 +1,5 @@
--TEST--
mixed/2.phpt
mixed: 2
--FILE--
<?php

@ -0,0 +1,37 @@
--TEST--
mixed: 3
--FILE--
<?php
function main()
{
$A = [4, 2, 5, 7];
print_r(sortArrayByParity1($A));
}
function sortArrayByParity1($A)
{
$len = count($A);
$j = $len - 2; // j为偶数的下标
// i为奇数的下标
for ($i = $len - 1; $i >= 0; $i = $i - 2) {
// 奇数位需要调换的偶数
if ($A[$i] % 2 !== $i % 2) {
// 偶数位不需要调换的偶数
while ($A[$j] % 2 === $j % 2) {
$j = $j - 2;
}
[$A[$i], $A[$j]] = [$A[$j], $A[$i]];
}
}
return $A;
}
?>
--EXPECT--
Array
(
[0] => 4
[1] => 5
[2] => 2
[3] => 7
)
Loading…
Cancel
Save