From 91a607185e55c94a413a8a3301b571f53f8a5d62 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Wed, 21 Jan 2026 19:38:55 +0800 Subject: [PATCH] =?UTF-8?q?refactor(php):=20=E6=8F=90=E5=8F=96=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E8=B0=83=E7=94=A8=E4=BC=98=E5=8C=96=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=88=B0=E7=8B=AC=E7=AB=8Btrait?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将函数调用优化代码从CompilerBase类中提取到FuncCallOptimizer trait - 在CompilerBase中引入FuncCallOptimizer trait - 使用parseFuncCallWithOptimizer方法替代原有的硬编码优化逻辑 - 添加对abs函数的优化支持 - 简化了原有条件判断结构,提高代码可维护性 --- src/Php/CompilerBase.php | 18 ++++-------------- src/Php/FuncCallOptimizer.php | 31 +++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 14 deletions(-) create mode 100644 src/Php/FuncCallOptimizer.php diff --git a/src/Php/CompilerBase.php b/src/Php/CompilerBase.php index 99b27853..680939d0 100644 --- a/src/Php/CompilerBase.php +++ b/src/Php/CompilerBase.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(); diff --git a/src/Php/FuncCallOptimizer.php b/src/Php/FuncCallOptimizer.php new file mode 100644 index 00000000..b8e54925 --- /dev/null +++ b/src/Php/FuncCallOptimizer.php @@ -0,0 +1,31 @@ +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; + } +} \ No newline at end of file