fix(compiler): 修复引用参数是对象时调用方法错误 #6

Merged
韩天峰 merged 1 commits from fix-ref-object into master 2 months ago
  1. 3
      src/Php/CompilerBase.php
  2. 58
      tests/aot/ref/ref-object.phpt

@ -5806,7 +5806,8 @@ class CompilerBase extends \PhpAot\Core\Translator implements PropertyAccessCont
// 可转为原生调用的 MethodCall
if ($this->isVarExpr($expr->var) and $this->isNamedMethod($expr->name)) {
$type = $this->getVarType($object);
if (!$this->checkArgType($type, self::TYPE_OBJECT)) {
// 引用参数允许方法调用:有class信息走原生调用,无class信息走动态调用
if (!$this->checkArgType($type, self::TYPE_OBJECT) and $type !== self::TYPE_REF) {
$methodName = $expr->name->toString();
// 非对象类型可使用内置方法
$fn = $this->findUniversalMethodAnyType($type, $methodName);

@ -0,0 +1,58 @@
--TEST--
Reference parameter with object type - property access and method call
--FILE--
<?php
class Test
{
public int $value = 123;
public function abc(): string
{
return "abc";
}
}
function test1(Test &$test): void
{
var_dump($test->value);
var_dump($test->abc());
$test->value = 456;
$test = clone $test;
$test->value = 789;
}
function test2(&$test)
{
var_dump($test->value);
var_dump($test->abc());
$test->value = 456;
$test = clone $test;
$test->value = 789;
}
function main()
{
$test = new Test();
$testOrigin = $test;
test1($test);
var_dump($test !== $testOrigin);
var_dump($testOrigin->value, $test->value);
$test = new Test();
$testOrigin = $test;
test2($test);
var_dump($test !== $testOrigin);
var_dump($testOrigin->value, $test->value);
}
?>
--EXPECTF--
int(123)
string(3) "abc"
bool(true)
int(456)
int(789)
int(123)
string(3) "abc"
bool(true)
int(456)
int(789)
Loading…
Cancel
Save