Skip to content

AST pretty-printing drops meaningful parentheses surrounding property access #22373

@TimWolla

Description

@TimWolla

Description

The following code:

<?php

try {
assert(false && new class {
	public function __construct(public Closure $f = strrev(...)) {
		var_dump(($this->f)('abc'));
	}
});
} catch (AssertionError $e) {
	echo $e->getMessage(), PHP_EOL;
}

Resulted in this output:

assert(false && new class {
    public function __construct(public Closure $f = strrev(...)) {
        var_dump($this->f('abc'));
    }

})

But I expected this output instead:

assert(false && new class {
    public function __construct(public Closure $f = strrev(...)) {
        var_dump(($this->f)('abc'));
    }

})

because the parentheses around $this->f are needed to disambiguate.

PHP Version

PHP 8.6.0-dev (cli) (built: Jun 21 2026 12:05:35) (NTS DEBUG)
Copyright © The PHP Group and Contributors
Zend Engine v4.6.0-dev, Copyright © Zend by Perforce
    with Zend OPcache v8.6.0-dev, Copyright ©, by Zend by Perforce

Operating System

No response

Metadata

Metadata

Assignees

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions