1--TEST-- 2new in attribute arguments 3--FILE-- 4<?php 5 6#[Attribute] 7class MyAttribute { 8 public function __construct(public $x, public $y) {} 9} 10 11#[MyAttribute(null, new stdClass)] 12class Test1 { 13} 14 15$rc = new ReflectionClass(Test1::class); 16$ra = $rc->getAttributes()[0]; 17$args1 = $ra->getArguments(); 18$obj1 = $ra->newInstance(); 19var_dump($args1, $obj1); 20 21// Check that we get fresh instances each time: 22$args2 = $ra->getArguments(); 23$obj2 = $ra->newInstance(); 24var_dump($args1[1] !== $args2[1]); 25var_dump($obj1->y !== $obj2->y); 26 27// Check that named args work: 28#[MyAttribute(y: new stdClass, x: null)] 29class Test2 { 30} 31 32$rc = new ReflectionClass(Test2::class); 33$ra = $rc->getAttributes()[0]; 34$args = $ra->getArguments(); 35$obj = $ra->newInstance(); 36var_dump($args, $obj); 37 38?> 39--EXPECTF-- 40array(2) { 41 [0]=> 42 NULL 43 [1]=> 44 object(stdClass)#%d (0) { 45 } 46} 47object(MyAttribute)#%d (2) { 48 ["x"]=> 49 NULL 50 ["y"]=> 51 object(stdClass)#%d (0) { 52 } 53} 54bool(true) 55bool(true) 56array(2) { 57 ["y"]=> 58 object(stdClass)#%d (0) { 59 } 60 ["x"]=> 61 NULL 62} 63object(MyAttribute)#%d (2) { 64 ["x"]=> 65 NULL 66 ["y"]=> 67 object(stdClass)#%d (0) { 68 } 69} 70