允许类方法的默认参数使用类常量

pull/1/head
韩天峰 4 months ago
parent d73d077a7a
commit fb458405b8
  1. 6
      src/Php/CompilerBase.php
  2. 6
      src/gen_stub.php
  3. 22
      tests/aot/self-class/002.phpt

@ -1423,9 +1423,9 @@ class CompilerBase extends \PhpAot\Core\Translator
$list = []; $list = [];
$list[] = $this->getIndent() . $tmpVar . ' = ' . $this->parseExpr($next); $list[] = $this->getIndent() . $tmpVar . ' = ' . $this->parseExpr($next);
$right = new Variable($tmpVar); $rightVar = new Variable($tmpVar);
foreach ($chain as $var) { foreach ($chain as $var) {
$list[] = $this->getIndent() . $this->parseAssignFinally($var, $right); $list[] = $this->getIndent() . $this->parseAssignFinally($var, $rightVar);
} }
return implode(";\n" . $this->getIndent(), $list); return implode(";\n" . $this->getIndent(), $list);
@ -2349,7 +2349,7 @@ class CompilerBase extends \PhpAot\Core\Translator
} }
$class = ''; $class = '';
$type = $this->parseTypeDecl($param->type, self::DECL_TYPE_OF_PARAM, $class); $type = $this->parseTypeDecl($param->type, self::DECL_TYPE_OF_PARAM, $class);
if ($class) { if ($class and !$this->hasInterface($class) and !$this->isAbstractClass($class)) {
$this->addObject($var, $class); $this->addObject($var, $class);
$argInfo->class = $class; $argInfo->class = $class;
} }

@ -4866,7 +4866,9 @@ function parseFunctionLike(
} }
if ($param->default instanceof Expr\ClassConstFetch && $param->default->class->toLowerString() === "self") { if ($param->default instanceof Expr\ClassConstFetch && $param->default->class->toLowerString() === "self") {
throw new Exception('The exact class name must be used instead of "self"'); $defaultValue = getTranslator()->getClassConstValue($func, $name->className->name, $param->default->name->name);
} else {
$defaultValue = $param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null;
} }
$foundVariadic = $param->variadic; $foundVariadic = $param->variadic;
@ -4877,7 +4879,7 @@ function parseFunctionLike(
$param->variadic, $param->variadic,
$type, $type,
isset($docParamTypes[$varName]) ? Type::fromString($docParamTypes[$varName]) : null, isset($docParamTypes[$varName]) ? Type::fromString($docParamTypes[$varName]) : null,
$param->default ? $prettyPrinter->prettyPrintExpr($param->default) : null, $defaultValue,
AttributeInfo::createFromGroups($param->attrGroups) AttributeInfo::createFromGroups($param->attrGroups)
); );
if (!$param->default && !$param->variadic) { if (!$param->default && !$param->variadic) {

@ -0,0 +1,22 @@
--TEST--
self class
--FILE--
<?php
class EvaluatedValue
{
const TYPE = 'string';
public function run(string $value, string $type = self::TYPE)
{
var_dump($value);
var_dump($type);
}
}
function main() {
$obj = new EvaluatedValue;
$obj->run('null');
}
?>
--EXPECT--
string(4) "null"
string(6) "string"
Loading…
Cancel
Save