Re: RFC - Array Of for PHP 7
| From: | Rowan Collins | Date: | Wed, 01 Nov 2017 14:40:55 +0000 |
| Subject: | Re: RFC - Array Of for PHP 7 | ||
| References: | 1 2 3 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-101016@lists.php.net to get a copy of this message | ||
On 31 October 2017 17:37:17 GMT+00:00, Levi Morrison <levim@php.net> wrote:
> - Our current infrastructure requires us to check every element of
>the array for conformance. While undesirable I believe this can be
>optimized away in the future if we care enough, and therefore not a
>show-stopper.
Do you have a mechanism in mind for "optimising this away"? I think releasing the feature
without any optimisation will just lead to painful slowdowns when people use it without realising
the implications.
As I said in my previous message, it seems to be a fundamental issue with PHP's current type
declarations that they are a) runtime, and b) asserted at arbitrary points, not at assignment. So
even if you optimise the check slightly, it's still a separate check every time you enter a new
function, which puts a limit on optimisation.
The only way I've thought of to improve things is to cache the result of previous type checks,
but this comes with all the normal challenges of caching. For instance, all assignments into the
array would need to invalidate these cached checks, or check the new value against each. References
would be particularly tricky, as they were with the property type hint proposal.
If we selectively invalidated cached checks, we'd be running specific type checks at every
variable assignment, but not letting the user actually assert on those checks. At which point,
should we approach from the other direction, and let the user declare variable types, rather than
assert value types?
This is kind of implied if we implement generics, too, since explicitly constructing an instance of
list<int> is asking the runtime to check future assignments to members of that list. In
effect, could declaring "int $foo = 42;" be considered equivalent to "$foo = new
checkedScalar<int>(42);"?
Regards,
--
Rowan Collins
[IMSoP]