Re: Local constants
| From: | John Bafford | Date: | Wed, 04 Sep 2024 20:17:07 +0000 |
| Subject: | Re: Local constants | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-125424@lists.php.net to get a copy of this message | ||
On Sep 4, 2024, at 15:23, Rob Landers <rob@bottled.codes> 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