On Wed, Sep 4, 2024, at 22:17, John Bafford wrote:
> 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

I think, conceptually, this makes sense, but maybe I'm the only one who writes

$arr = doSomething();
$arr = array_map(fn($x) => $x->prop, $arr);
$arr = array_filter($arr, $filterFunc);

instead of

$arr = array_filter(array_map(fn($x) => $x->prop, doSomething()), $filterFunc);

And I feel like having constant variables would result in more of the latter, 
which I feel is more unreadable. Though I do note that my opinion of what is 
readable might be different from other people's.

That being said, I would much rather see block-scoped variables than local 
variables via let or var or something:

var $aNumber = 12;

foreach($arr as var $item) {
  echo $item; // item exists here
}

echo $item; // item doesn't exist here

PHP is simply too verbose to really benefit from local constants, but would 
benefit from block-scope far more. For example, with local constants, you 
couldn't write that foreach because that variable exists in the scope of the 
function and can only be defined once.

— Rob

Reply via email to