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
>
>

Reply via email to