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