refactor(php): 提取函数调用优化逻辑到独立trait

- 将函数调用优化代码从CompilerBase类中提取到FuncCallOptimizer trait
- 在CompilerBase中引入FuncCallOptimizer trait
- 使用parseFuncCallWithOptimizer方法替代原有的硬编码优化逻辑
- 添加对abs函数的优化支持
- 简化了原有条件判断结构,提高代码可维护性
pull/1/head
韩天峰 7 months ago
parent 62e5615421
commit 91a607185e
  1. 18
      src/Php/CompilerBase.php
  2. 31
      src/Php/FuncCallOptimizer.php

@ -25,6 +25,7 @@ use stdClass;
class CompilerBase extends \PhpAot\Core\Translator
{
use AstNodeType;
use FuncCallOptimizer;
public const string TYPE_VAR = 'php::Var';
public const string TYPE_BOOL = 'php::Bool';
public const string TYPE_INT = 'php::Int';
@ -1411,20 +1412,9 @@ class CompilerBase extends \PhpAot\Core\Translator
} else {
$fn = '"' . $name . '"';
}
if ($name === 'strlen' or $name === 'sizeof' or $name === 'count') {
return 'php::len(' . $this->parseIdentifier($expr->args[0]->value) . ')';
}
if (count($expr->args) == 1) {
switch ($name) {
case 'intval':
return $this->convertIntExpr($this->parseExpr($expr->args[0]->value));
case 'floatval':
return $this->convertFloatExpr($this->parseExpr($expr->args[0]->value));
case 'boolval':
return $this->convertBoolExpr($this->parseExpr($expr->args[0]->value));
default:
break;
}
$code = $this->parseFuncCallWithOptimizer($name, $expr);
if ($code) {
return $code;
}
} else {
$tmpVar = $this->genTmpVarName();

@ -0,0 +1,31 @@
<?php
namespace PhpAot\Php;
use PhpParser\Node;
trait FuncCallOptimizer
{
protected function parseFuncCallWithOptimizer(string $name, Node\Expr\FuncCall $expr): string|false
{
if ($name === 'strlen' or $name === 'sizeof' or $name === 'count') {
return 'php::len(' . $this->parseIdentifier($expr->args[0]->value) . ')';
}
if (count($expr->args) == 1) {
switch ($name) {
case 'intval':
return $this->convertIntExpr($this->parseExpr($expr->args[0]->value));
case 'floatval':
return $this->convertFloatExpr($this->parseExpr($expr->args[0]->value));
case 'boolval':
return $this->convertBoolExpr($this->parseExpr($expr->args[0]->value));
default:
break;
}
}
if ($name === 'abs') {
return 'php::math::abs(' . $this->parseIdentifier($expr->args[0]->value) . ')';
}
return false;
}
}
Loading…
Cancel
Save