Re: Missing reflection info about strict types?
| From: | Michael Morris | Date: | Mon, 05 Sep 2016 14:08:20 +0000 |
| Subject: | Re: Missing reflection info about strict types? | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-95648@lists.php.net to get a copy of this message | ||
On Mon, Sep 5, 2016 at 5:49 AM, Davey Shafik <me@daveyshafik.com> wrote:
>
> > On Sep 5, 2016, at 02:38, Nicolas Grekas <nicolas.grekas@gmail.com>
> wrote:
> >
> > Hello,
> >
> > It looks like we miss a way to check by reflection if a function/method
> has
> > strict types enabled or not.
> >
> > We'd need to do this in Symfony to generate a file with concatenated
> > classes, but split "declare_strict=1" classes out so that they don't
> break
> > (because there is no way to create a single file that contains both
> strict
> > and non-strict classes unfortunately also).
> >
> > Would it be possible to expose some flavor of ZEND_ACC_STRICT_TYPES to
> > userland?
>
> Strict types are only enforced from the CALL site. A library author cannot
> dictate that their code be called using strict types or not, only the file
> actually calling the library methods can. Though, regardless, the type
> hints do ensure that the value received is of the type specified, you just
> won't know if it was coerced or not.
>
> Just like when you import a namespaced class and alias it, the alias only
> works in the file the "use " statement is in.
>
> Therefore, you cannot actually author strict or non-strict classes period,
> unless they are only called in the file in which they are defined.
>
Actually you can, in PHP 5 even. This sort of thing is what the assert()
statement is for.
public function stringsOnly( $var ) {
assert(is_str($var), 'Strings Only!');
}
This does have the weakness of not working when assertions are turned off.
If $var is a form of user input then an exception test is called for, and
likely should be done before stringsOnly in this example gets worked with.