feat(php): 添加属性访问表达式支持

- 添加 EXPR_PROPERTY_FETCH 常量用于标识属性访问表达式
- 在解析器中实现对 Expr_PropertyFetch 节点的支持
- 使用 parseIdentifier 方法替代 convertToObject 方法处理对象属性访问
- 添加对象链式访问操作符测试用例
- 支持属性连接赋值操作符 (.=) 的解析和执行
pull/1/head
韩天峰 6 months ago
parent 35117d5c14
commit b1662f3cc9
  1. 9
      src/Php/CompilerBase.php
  2. 14
      tests/aot/object-link-002.phpt
  3. 15
      tests/aot/object-link-003.phpt

@ -67,6 +67,7 @@ class CompilerBase extends \PhpAot\Core\Translator
public const string EXPR_NEW = 'Expr_New';
public const string EXPR_ARRAY_DIM_FETCH = 'Expr_ArrayDimFetch';
public const string EXPR_PROPERTY_FETCH = 'Expr_PropertyFetch';
public const string NAMESPACE_SEPARATOR = '__';
@ -361,7 +362,7 @@ class CompilerBase extends \PhpAot\Core\Translator
return $this->parseArray($expr);
case self::EXPR_ARRAY_DIM_FETCH:
return $this->parseArrayDimFetch($expr, $this->inAssignExpr);
case 'Expr_PropertyFetch':
case self::EXPR_PROPERTY_FETCH:
return $this->parsePropertyFetch($expr, $this->inAssignExpr);
case 'Expr_BinaryOp_ShiftLeft':
return $this->parseBinaryOpShiftLeft($expr);
@ -1828,6 +1829,10 @@ class CompilerBase extends \PhpAot\Core\Translator
return $this->parseArrayDimStore($node->var->var, $dim, $tmpVar);
}
if ($this->isAssignOpConcat($op)) {
return $var . '.append(' . $expr . ')';
}
return $var . ' ' . $op . ' (' . $expr . ')';
}
@ -2860,7 +2865,7 @@ class CompilerBase extends \PhpAot\Core\Translator
$object = $expr->var;
$property = $expr->name;
$id = $this->getPropertyIdentifier($object, $property);
return $this->convertToObject($object) . '.attr(' . $id . ', ' . $this->escapeBool($update) . ')';
return $this->parseIdentifier($object) . '.attr(' . $id . ', ' . $this->escapeBool($update) . ')';
}
protected function parseAssignOpShiftRight(Node $node): string

@ -0,0 +1,14 @@
--TEST--
object link operator 002
--FILE--
<?php
function main()
{
$o = new stdClass();
$o->prop = new stdClass();
$o->prop->value = "value";
var_dump($o->prop->value);
}
?>
--EXPECT--
string(5) "value"

@ -0,0 +1,15 @@
--TEST--
object link operator 003
--FILE--
<?php
function main()
{
$o = new stdClass();
$o->prop = new stdClass();
$o->prop->value = "value";
$o->prop->value .= " 2025";
var_dump($o->prop->value);
}
?>
--EXPECT--
string(10) "value 2025"
Loading…
Cancel
Save