fix(php): 修复常量比较的大小写敏感问题

- 修改 isScalarBool 方法使用 strtolower 进行不区分大小写的布尔值比较
- 修改 getBoolValue 方法使用 strcasecmp 替代严格相等比较
- 修改 isNull 方法使用 strcasecmp 进行不区分大小写的 null 比较
- 在 getConstantValue 中使用 strcasecmp 替代严格相等比较
- 在 getTypeFromConstant 中使用 strcasecmp 替行不区分大小写的布尔值检查
- 添加对函数内部声明函数的错误检查
- 添加测试用例验证布尔数组排序功能
pull/3/head
韩天峰 2 months ago
parent 397bfc9fbb
commit 989395d7e1
  1. 6
      src/Php/AstNodeType.php
  2. 13
      src/Php/CompilerBase.php
  3. 17
      tests/aot/array/008.phpt

@ -102,12 +102,12 @@ trait AstNodeType
protected function isScalarBool(NodeAbstract $expr): bool
{
return $expr instanceof Expr\ConstFetch and in_array($expr->name->toString(), ['true', 'false']);
return $expr instanceof Expr\ConstFetch and in_array(strtolower($expr->name->toString()), ['true', 'false']);
}
protected function getBoolValue(Expr\ConstFetch $expr): string
{
return $expr->name->toString() === 'true' ? self::VALUE_TRUE : self::VALUE_FALSE;
return strcasecmp($expr->name->toString(), 'true') === 0 ? self::VALUE_TRUE : self::VALUE_FALSE;
}
protected function isMatchExpr(NodeAbstract $expr): bool
@ -175,6 +175,6 @@ trait AstNodeType
protected function isNull(NodeAbstract $expr): bool
{
return $expr instanceof Expr\ConstFetch && $expr->name->toString() === 'null';
return $expr instanceof Expr\ConstFetch && strcasecmp($expr->name->toString(), 'null') === 0;
}
}

@ -1419,6 +1419,9 @@ class CompilerBase extends \PhpAot\Core\Translator
case 'Stmt_Class':
$this->fatalError($v, 'Cannot declare class in function');
break;
case 'Stmt_Function':
$this->fatalError($v, 'Cannot declare function in function');
break;
default:
abort($v);
break;
@ -3550,13 +3553,13 @@ class CompilerBase extends \PhpAot\Core\Translator
return $this->getConstant($importedName);
}
}
if ($name === 'null') {
if (strcasecmp($name, 'null') === 0) {
return self::VALUE_NULL;
}
if ($name === 'true') {
if (strcasecmp($name, 'true') === 0) {
return 'true';
}
if ($name === 'false') {
if (strcasecmp($name, 'false') === 0) {
return 'false';
}
if ($name === 'PHP_EOL') {
@ -4151,10 +4154,10 @@ class CompilerBase extends \PhpAot\Core\Translator
if ($this->isInternalConstant($name)) {
return $this->getTypeFromZendType(gettype($this->internalConstants[$name]));
}
if ($name === 'true') {
if (strcasecmp($name, 'true') === 0) {
return self::TYPE_BOOL;
}
if ($name === 'false') {
if (strcasecmp($name, 'false') === 0) {
return self::TYPE_BOOL;
}
if ($name === 'NAN' or $name === 'INF') {

@ -0,0 +1,17 @@
--TEST--
Array 007
--FILE--
<?php
$bool_values = array (true => true, false => false, TRUE => TRUE, FALSE => FALSE);
$temp_array = $bool_values;
var_dump(krsort($temp_array) );
var_dump($temp_array);
?>
--EXPECT--
bool(true)
array(2) {
[1]=>
bool(true)
[0]=>
bool(false)
}
Loading…
Cancel
Save