I'd expect it to obey the strict_types declaration of UseOfMyAttribute.php, too. I see it as being where the attribute's constructor is "called", even though the actual object instantiation happens somewhere else.
— Benjamin On Tue, 22 Sep 2020 at 16:11, Larry Garfield <la...@garfieldtech.com> wrote: > On Tue, Sep 22, 2020, at 7:58 AM, Nikita Popov wrote: > > Hi internals, > > > > I would like to clarify how attributes are supposed to interact with > > strict_types. Consider the following code, split up into three files to > > make it clear that each one could have their own strict_types mode: > > > > MyAttribute.php > > <?php > > #[Attribute] > > class MyAttribute { > > public function __construct(string $a) {} > > } > > > > UseOfMyAttribute.php > > <?php > > declare(strict_types=1); > > #[MyAttribute(42)] > > class Test {} > > > > AccessOfAttribute.php > > <?php > > var_dump((new > > ReflectionClass(Test::class'))->getAttributes()[0]->newInstance()); > > > > Currently, what happens is that this code will construct the attribute, > > converting int 42 into string "42", even though UseOfMyAttribute.php has > > strict_types=1. > > > > My intuitive expectation here would be that we should be following the > > strict_types mode of wherever the attribute is being used (i.e. > > UseOfMyAttribute.php, not MyAttribute.php or AccessOfAttribute.php). > > Currently, we always assume strict_types=0. > > > > Is my expectation correct? > > > > Regards, > > Nikita > > I could see an argument for either UseOfMyAttribute.php or > AccessOfAttribute.php. I think I would also favor UseOfMyAttribute.php, > however, because if you get it wrong the place you have to change it is in > that file, so it should obey the setting in that file. > > --Larry Garfield > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: https://www.php.net/unsub.php > >