fix(stub): 修复异常处理并支持属性默认值中的new操作

- 在RuntimeException中添加堆栈跟踪信息输出
- 新增对属性默认值为new表达式的处理逻辑
- 添加测试用例验证nullable类型属性的处理
- 支持构造函数参数中使用new操作符作为默认值
pull/1/head
韩天峰 3 months ago
parent c77d3ca273
commit 04a56a7762
  1. 5
      src/gen_stub.php
  2. 48
      tests/aot/object_property/prop-005.phpt

@ -148,7 +148,7 @@ function processStubFile(string $stubFile, Context $context, bool $includeOnly =
return $fileInfo;
} catch (Exception $e) {
throw new RuntimeException("In " . getTranslator()->getRelativePath($stubFile) . ": {$e->getMessage()}");
throw new RuntimeException("In " . getTranslator()->getRelativePath($stubFile) . ": {$e->getMessage()}\n". $e->getTraceAsString());
}
}
@ -3246,7 +3246,8 @@ class PropertyInfo extends VariableLike
$propertyName = $this->name->getDeclarationName();
if ($this->defaultValue === null) {
// New 操作作为属性的默认值,需编译器处理 gen_stub 作为 null 值
if ($this->defaultValue === null || $this->defaultValue instanceof Expr\New_) {
$defaultValue = EvaluatedValue::null();
} else {
$defaultValue = EvaluatedValue::createFromExpression($this->defaultValue, null, null, $allConstInfos);

@ -0,0 +1,48 @@
--TEST--
Property with nullable type
--FILE--
<?php
class Router { function dispatch() { echo "router\n"; } }
class SessionManager { function start() { echo "SessionManager\n"; } }
class CsrfGuard { function validate() { echo "CsrfGuard\n"; } }
class Handler {
private string $name;
public function __construct(string $name) {
$this->name = $name;
}
function handleError() {
echo $this->name . "\n";
}
}
class SpaRenderer { function render() { echo "SpaRenderer\n"; } }
class App {
public function __construct(
private Router $router,
private SessionManager $sessions = new SessionManager(),
private CsrfGuard $csrf = new CsrfGuard(),
private Handler $errors = new Handler('Handler'),
private SpaRenderer $spa = new SpaRenderer(),
) {}
public function run() {
$this->router->dispatch();
$this->sessions->start();
$this->csrf->validate();
$this->errors->handleError();
$this->spa->render();
}
}
function main()
{
$app = new App(new Router());
$app->run();
}
?>
--EXPECT--
router
SessionManager
CsrfGuard
Handler
SpaRenderer
Loading…
Cancel
Save