fix(stub): 修复 self/parent/static 类常量引用解析失败的问题

pull/37/head
Yurun 1 month ago
parent 2287695b44
commit edcbcf7cff
  1. 29
      src/gen_stub.php
  2. 41
      tests/compiler/self-class/003.phpt

@ -2368,20 +2368,23 @@ class EvaluatedValue
return ltrim($className, '\\'); return ltrim($className, '\\');
} }
$class = getClassConstFetchClassName($expr); $class = getClassConstFetchClassName($expr);
if ($class === 'self') { // Resolve the special class-name keywords to concrete classes.
$constName = ClassInfo::$currentClass . "::" . $constName; // Previously `self` was passed as both the class and a
if (isset($allConstInfos[$constName])) { // `ClassName::` name prefix (yielding `B::B::A`), and `parent` /
return $allConstInfos[$constName]->getValue($allConstInfos)->value; // `static` were passed verbatim (yielding `parent::A`), so the
} else { // constant lookup always failed.
return normalizeConstExprValue( if (strcasecmp($class, 'self') === 0 || strcasecmp($class, 'static') === 0) {
getTranslator()->getClassConstValue($expr, ClassInfo::$currentClass, $constName) $class = ClassInfo::$currentClass;
); } elseif (strcasecmp($class, 'parent') === 0) {
} $class = getTranslator()->getParentClass(ClassInfo::$currentClass);
} else { }
return normalizeConstExprValue( $fqcnName = ltrim($class, '\\') . "::" . $constName;
getTranslator()->getClassConstValue($expr, $class, $constName, ClassInfo::$currentClass) if (isset($allConstInfos[$fqcnName])) {
); return $allConstInfos[$fqcnName]->getValue($allConstInfos)->value;
} }
return normalizeConstExprValue(
getTranslator()->getClassConstValue($expr, $class, $constName, ClassInfo::$currentClass)
);
} else { } else {
$constName = $expr->name->__toString(); $constName = $expr->name->__toString();
if (strtolower($constName) === "unknown") { if (strtolower($constName) === "unknown") {

@ -0,0 +1,41 @@
--TEST--
Class constant referenced via self:: / parent:: / ClassName:: as a property default value
--FILE--
<?php
declare(strict_types=1);
class A
{
const A = 1;
const B = 2;
}
class B extends A
{
// self:: referencing an inherited constant.
// Bug: self::A was incorrectly resolved as B::B::A and the lookup failed.
public $a = self::A;
// self:: referencing a constant declared in the same class.
const LOCAL = 10;
public $local = self::LOCAL;
// parent:: referencing a parent constant.
public $b = parent::A;
// explicit class name.
public $c = A::B;
}
function main()
{
$test = new B;
var_dump($test->a);
var_dump($test->local);
var_dump($test->b);
var_dump($test->c);
}
?>
--EXPECT--
int(1)
int(10)
int(1)
int(2)
Loading…
Cancel
Save