From dd940db5d99443d783830cad573b2e1491baca46 Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Tue, 26 May 2026 13:10:10 +0800 Subject: [PATCH] =?UTF-8?q?feat(php):=20=E6=B7=BB=E5=8A=A0=E6=95=B0?= =?UTF-8?q?=E5=AD=A6=E5=87=BD=E6=95=B0=E5=92=8C=E6=95=B0=E7=BB=84=E6=8E=92?= =?UTF-8?q?=E5=BA=8F=E6=96=B9=E6=B3=95=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 abs、ceil、floor、round 等数学函数支持 - 添加 sqrt、pow、log、exp 等数学运算函数 - 添加三角函数 sin、cos、tan 及其反函数 - 添加角度转换函数 deg2rad、rad2deg - 添加最值函数 max、min - 添加数组排序方法 sortDesc、keySort、valueSort - 添加数组组合函数 combine 和 fillKeys - 为整型和浮点型分别配置数学函数映射 --- src/Php/UniversalMethodCall.php | 47 +++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/src/Php/UniversalMethodCall.php b/src/Php/UniversalMethodCall.php index 2f2aa3d5..7b798a87 100644 --- a/src/Php/UniversalMethodCall.php +++ b/src/Php/UniversalMethodCall.php @@ -20,6 +20,27 @@ trait UniversalMethodCall 'toFloat' => ['handler' => 'convert_fn', 'fn' => 'toFloat', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], 'toString' => ['handler' => 'convert_fn', 'fn' => 'toString', 'return_type' => self::TYPE_STR, 'min_args' => 0, 'max_args' => 0], 'toBool' => ['handler' => 'convert_fn', 'fn' => 'toBool', 'return_type' => self::TYPE_BOOL, 'min_args' => 0, 'max_args' => 0], + // math + 'abs' => ['handler' => 'php_fn', 'fn' => 'abs', 'return_type' => self::TYPE_INT, 'min_args' => 0, 'max_args' => 0], + 'ceil' => ['handler' => 'php_fn', 'fn' => 'ceil', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'floor' => ['handler' => 'php_fn', 'fn' => 'floor', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'round' => ['handler' => 'php_fn', 'fn' => 'round', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 2], + 'sqrt' => ['handler' => 'php_fn', 'fn' => 'sqrt', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'pow' => ['handler' => 'php_fn', 'fn' => 'pow', 'return_type' => self::TYPE_VAR, 'min_args' => 1, 'max_args' => 1], + 'log' => ['handler' => 'php_fn', 'fn' => 'log', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 1], + 'log10' => ['handler' => 'php_fn', 'fn' => 'log10', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'exp' => ['handler' => 'php_fn', 'fn' => 'exp', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'sin' => ['handler' => 'php_fn', 'fn' => 'sin', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'cos' => ['handler' => 'php_fn', 'fn' => 'cos', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'tan' => ['handler' => 'php_fn', 'fn' => 'tan', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'asin' => ['handler' => 'php_fn', 'fn' => 'asin', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'acos' => ['handler' => 'php_fn', 'fn' => 'acos', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'atan' => ['handler' => 'php_fn', 'fn' => 'atan', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'atan2' => ['handler' => 'php_fn', 'fn' => 'atan2', 'return_type' => self::TYPE_FLOAT, 'min_args' => 1, 'max_args' => 1], + 'deg2rad' => ['handler' => 'php_fn', 'fn' => 'deg2rad', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'rad2deg' => ['handler' => 'php_fn', 'fn' => 'rad2deg', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'max' => ['handler' => 'php_fn', 'fn' => 'max', 'return_type' => self::TYPE_INT, 'min_args' => 1, 'max_args' => 1], + 'min' => ['handler' => 'php_fn', 'fn' => 'min', 'return_type' => self::TYPE_INT, 'min_args' => 1, 'max_args' => 1], ], self::TYPE_FLOAT => [ 'add' => ['handler' => 'calc_op', 'op' => '+', 'return_type' => self::TYPE_FLOAT, 'min_args' => 1, 'max_args' => 1], @@ -31,6 +52,27 @@ trait UniversalMethodCall 'toInt' => ['handler' => 'convert_fn', 'fn' => 'toInt', 'return_type' => self::TYPE_INT, 'min_args' => 0, 'max_args' => 0], 'toString' => ['handler' => 'convert_fn', 'fn' => 'toString', 'return_type' => self::TYPE_STR, 'min_args' => 0, 'max_args' => 0], 'toBool' => ['handler' => 'convert_fn', 'fn' => 'toBool', 'return_type' => self::TYPE_BOOL, 'min_args' => 0, 'max_args' => 0], + // math + 'abs' => ['handler' => 'php_fn', 'fn' => 'abs', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'ceil' => ['handler' => 'php_fn', 'fn' => 'ceil', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'floor' => ['handler' => 'php_fn', 'fn' => 'floor', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'round' => ['handler' => 'php_fn', 'fn' => 'round', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 2], + 'sqrt' => ['handler' => 'php_fn', 'fn' => 'sqrt', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'pow' => ['handler' => 'php_fn', 'fn' => 'pow', 'return_type' => self::TYPE_FLOAT, 'min_args' => 1, 'max_args' => 1], + 'log' => ['handler' => 'php_fn', 'fn' => 'log', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 1], + 'log10' => ['handler' => 'php_fn', 'fn' => 'log10', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'exp' => ['handler' => 'php_fn', 'fn' => 'exp', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'sin' => ['handler' => 'php_fn', 'fn' => 'sin', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'cos' => ['handler' => 'php_fn', 'fn' => 'cos', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'tan' => ['handler' => 'php_fn', 'fn' => 'tan', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'asin' => ['handler' => 'php_fn', 'fn' => 'asin', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'acos' => ['handler' => 'php_fn', 'fn' => 'acos', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'atan' => ['handler' => 'php_fn', 'fn' => 'atan', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'atan2' => ['handler' => 'php_fn', 'fn' => 'atan2', 'return_type' => self::TYPE_FLOAT, 'min_args' => 1, 'max_args' => 1], + 'deg2rad' => ['handler' => 'php_fn', 'fn' => 'deg2rad', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'rad2deg' => ['handler' => 'php_fn', 'fn' => 'rad2deg', 'return_type' => self::TYPE_FLOAT, 'min_args' => 0, 'max_args' => 0], + 'max' => ['handler' => 'php_fn', 'fn' => 'max', 'return_type' => self::TYPE_FLOAT, 'min_args' => 1, 'max_args' => 1], + 'min' => ['handler' => 'php_fn', 'fn' => 'min', 'return_type' => self::TYPE_FLOAT, 'min_args' => 1, 'max_args' => 1], ], self::TYPE_BOOL => [ 'toInt' => ['handler' => 'convert_fn', 'fn' => 'toInt', 'return_type' => self::TYPE_INT, 'min_args' => 0, 'max_args' => 0], @@ -183,6 +225,11 @@ trait UniversalMethodCall 'unshift' => ['handler' => 'php_fn_ref', 'fn' => 'array_unshift', 'return_type' => self::TYPE_INT, 'min_args' => 1, 'max_args' => -1], 'splice' => ['handler' => 'php_fn_ref', 'fn' => 'array_splice', 'return_type' => self::TYPE_ARRAY, 'min_args' => 1, 'max_args' => 3], 'walk' => ['handler' => 'php_fn_ref', 'fn' => 'array_walk', 'return_type' => self::TYPE_BOOL, 'min_args' => 1, 'max_args' => 2], + 'sortDesc' => ['handler' => 'php_fn_ref', 'fn' => 'rsort', 'return_type' => self::TYPE_BOOL, 'min_args' => 0, 'max_args' => 1], + 'keySort' => ['handler' => 'php_fn_ref', 'fn' => 'ksort', 'return_type' => self::TYPE_BOOL, 'min_args' => 0, 'max_args' => 1], + 'valueSort' => ['handler' => 'php_fn_ref', 'fn' => 'asort', 'return_type' => self::TYPE_BOOL, 'min_args' => 0, 'max_args' => 1], + 'combine' => ['handler' => 'php_fn', 'fn' => 'array_combine', 'return_type' => self::TYPE_ARRAY, 'min_args' => 1, 'max_args' => 1], + 'fillKeys' => ['handler' => 'php_fn', 'fn' => 'array_fill_keys', 'return_type' => self::TYPE_ARRAY, 'min_args' => 1, 'max_args' => 1], 'replaceStr' => ['handler' => 'php_fn', 'fn' => 'str_replace', 'receiver_pos' => 3, 'return_type' => self::TYPE_ARRAY, 'min_args' => 1, 'max_args' => 2], 'iReplaceStr' => ['handler' => 'php_fn', 'fn' => 'str_ireplace', 'receiver_pos' => 3, 'return_type' => self::TYPE_ARRAY, 'min_args' => 1, 'max_args' => 2], // serialize