Hi Ilija,
The optimizer, including type inference, is limited to the scope of
the current file (along with internal functions/classes). [...]
Preloading is the exception, where all preloaded files can assume not
to be changed after PHP has booted.
Well, I was actually thinking of enabling these compile-time checks only
if preloading is enabled, to ensure the closed-world guarantee.
We could make type checking a CLI step but how is that really better than
PHPStan or Psalm at that point
Yeah don't really like the idea of a separate "typechecking" step
either, I'd really love for this to be an integral part of the execution
process, not as a separate static analysis step.
PHPStan and Psalm are arguably successful *because* they are
written in PHP, making them much easier to maintain and contribute to.
Agreed, however if at least some static analysis functionality is
already implemented, I see no reason to not make use of it, even if
PHP does not accurately represent arrays in the optimizer and has no notion of
array shapes.
personally I really like array shapes but *only* as a stopgap measure
while switching to full object DTOs, so I'm comfortable with the idea of
not having static analysis for array shapes (actually, I would
absolutely love to just treat all array values as mixed during static
analysis, though array/list generics might be nice and easy to
implement...).
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.
Well I'm all for stricter rules :)
Regards,
Daniil Gentili.