Re: Previous discussions about generics syntax only?
| From: | Ilija Tovilo | Date: | Fri, 03 Nov 2023 09:56:02 +0000 |
| Subject: | Re: Previous discussions about generics syntax only? | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-121563@lists.php.net to get a copy of this message | ||
Hi Daniil
On Fri, Nov 3, 2023 at 12:00 AM <daniil@daniil.it> wrote:
> The much better approach, one that I intend to maybe give a shot at this Christmas, is to add
> static analysis functionality to PHP itself (i.e. turn it into a truly statically typed language).
> I have a hunch it may be easy enough to do by hooking into the type inference functionality
> provided by opcache, and throw compile-time exceptions instead of silently inserting runtime
> typechecks.
The optimizer, including type inference, is limited to the scope of
the current file (along with internal functions/classes). Each file is
considered a "single compilation unit". When classes from different
files reference each other, modifying one file does not require
recompiling the other. However, this does mean that we cannot rely on
information from other files as they may change at any point.
Preloading is the exception, where all preloaded files can assume not
to be changed after PHP has booted.
We can obviously not limit type checking to preloaded files. We could
make type checking a CLI step but how is that really better than
PHPStan or Psalm at that point, other than having the official PHP
stamp? PHPStan and Psalm are arguably successful *because* they are
written in PHP, making them much easier to maintain and contribute to.
I'd also like to add that tools like PHPStan and Psalm have much more
accurate type representations. PHP does not accurately represent
arrays in the optimizer and has no notion of array shapes. The
optimizers types are biased towards speed rather than accuracy.
Another issue, specifically pertaining to generics, is that PHP has
type coercion. In both weak and strict typing mode, a float function
parameter will coerce an integer value. However, if generic types are
erased at runtime then the VM cannot do coercion for foo<float>($int)
(where function foo<T>(T $var)). This will require either accepting
inaccurate runtime types, or establishing stricter static rules that
do not match the existing behavior.
Ilija