On Sep 4, 2024, at 15:23, Rob Landers <[email protected]> wrote:
>
> On Tue, Sep 3, 2024, at 05:20, HwapX wrote:
>> Hello internals!
>>
>> I was wondering, has there been any discussion about supporting local
>> constants (variables that cannot be reassigned, perhaps even function
>> parameters)?
>
> Out of curiosity, what value would this bring to PHP? In my experience,
> modern php methods and functions tend to fit on a single screen, at most
> being a few hundred lines for complex logic.
>
> — Rob
This is about semantic clarity. If you define a variable as a constant, then,
not only do you know for certain that it cannot change, you are also stating
"it is my intent to not change this variable after setting it", and so if
someone later tries to do so, they (should) have to answer the question, "*why*
do I need to make this variable change?".
If it's useful to be able to annotate class members as being "readonly", it is
likewise useful to do that on a local scope.
With sufficient compiler support, *typed* constant variable declarations might
also allow for this:
let SomeType $foo; //or readonly, or writeonce, or whatever
if($something) {
$foo = ...;
} else if($somethingElse) {
$foo = getSomeString(); //Error, type mismatch; possibly
catchable at compile time, definitely with static analysis
} else if($thirdCondition) {
$foom = ...; //oops, typo
} else {
throw new Exception(...)
}
doSomething($foo); //Compiler error: $foo not initialized on all call
paths.
}
You might also tighten scoping with such variables:
foreach(...) {
let $foo = //local working variable; possibly even shadowing a
variable in the parent scope
}
//$foo is undefined; you can't access the last-set value from the loop
outside of the loop
Static analysis can catch all these errors, but it'd be nicer to be able to do
it without requiring docblocks. The language providing tools for being more
explicit about intent in code is never bad.
-John