> On Mar 15, 2020, at 2:53 PM, tyson andre <tysonandre...@hotmail.com> wrote:
> 
> Hi Mike,
> 
>> What I would rather see are new features in PHP that encourage developer
>> to break functionality into shorter and simpler functions and methods, and 
>> to minimize nesting.
> 
> I would also like to see shorter functions in general, but:
> 
> - Other developers may prefer long functions/scripts despite my preferences,
>   but their code would still benefit from readability by having block-scoped 
> variables enforced by the compiler

What I am about to say is ironic since I too often feel people are trying to 
enforce their view of coding on the world, but I do not think we want to give 
people tools to make it easier to work with long functions/scripts. 

And while I do understand that other people can disagree, please understand I 
am just stating my opinion here.

> - Some problem domains are complex (e.g. business logic) and require a lot of 
> variables,
>   leading to long functions/scripts, and trying to split them up may be 
> error-prone
>   or cause awkward divisions of functionality.

I would be very interested in seeing business logic coded into a long function 
that literally cannot be made better by refactoring into multiple smaller 
functions.

If you have some, please do post to a Gist and share it to see if it in fact it 
cannot be refactored and made "better."

> - Even in short functions of a few dozen lines, it may be useful to know if 
> reused variables such as
>   `$i` are definitely scoped to a loop, when reviewing code.
> 
>> There is also an issue with block scoping that is reasonably well-known
>> among the GoLang community called variable shadowing
>> and that is a developer seeing a variable in block scoping
>> and thinking they are accessing or assigning the function-scoped variable.
> 
> Variable shadowing is also an issue in JavaScript.
> While JavaScript and GoLang don't allow introspection of the variable scope
> (as far as I know, not sure about reflection),
> PHP does allow dynamic access by name ($$var, 
> `get_defined_variables()['var']` in a require()d file, XDebug),
> and any proposal for block scoping in PHP will need to account for that 
> somehow.
> 
> - Aside: Personally, I set up linting for golang projects to forbid shadowing.
> 
> My best plan for dealing with variable shadowing in PHP was to forbid it 
> entirely,
> which I mentioned examples of in the proposal.
> 
>> {
>>    let $outer = 1;
>>    {
>>        let $outer = 2;  // E_COMPILE_ERROR to declare in a different 
>> (shadowed) scope, can only reassign
>>        $outer = 3;   // this is allowed
>>     }
>> }
> 
>> P.S. If you really need block scope within a long function or method you can 
>> already create a closure and call it in the same expression:
> 
> I'm aware of this and have used it (e.g. to avoid modifying the global scope 
> in large projects),
> but avoid it in functions due to the awkward syntax and the performance 
> overhead of function calls.

Given the nature of long functions, I think the awkward syntax here provides a 
nice disincentive to writing overly long functions.  

But as I said, the closure does exist in case someone absolutely needs to 
control the scope of a block within an existing long function, such as the 1400 
line function I've been refactoring for months now...

> I'd generally just use a different variable name.
> 
> - Tyson

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to