Thanks for the feedback. Thanks for the tip on avoiding embedded images.

*Anna*: Definitely agree that long signatures, along with lots of optional
parameters can be signs of other issues.

That's why I used a 3 parameter signature in my example, where it's
"required", "optional", "optional", which I feel is pretty common.

Here's an example from the Laravel codebase of that in action:

public function ensureDirectoryExists($path, $mode = 0755, $recursive = true)
{
    if (! $this->isDirectory($path)) {
        $this->makeDirectory($path, $mode, $recursive);
    }
}

In this scenario, I may not particularly care to explicitly define my mode,
and instead defer to the package maintainer, but I may care to prevent a
recursive directory from being made.

*Allen*: Thanks for the links to the other discussions.  I think this RFC (
https://wiki.php.net/rfc/skipparams) is basically exactly what I'm
proposing.

I know named arguments are a hotly contested feature right now, and
honestly I'm not sure where I fall on them right now.  But I would also see
this as a complement to named parameters.

I can see this feature has been debated heavily in the past, so I probably
won't get anywhere further than they already have with it.

Thanks for the help!

On Thu, Jan 14, 2021 at 12:25 PM AllenJB <php.li...@allenjb.me.uk> wrote:

> Hi,
>
> It looks like your images have broken (Random guess: the list may remove
> attachments).
>
> As a general rule, I would suggest avoiding screenshots for code. Common
> mailing list etiquette for development lists is to avoid attachments or
> embedded remote images as these tend to get lost in history, and not all
> list members may be using graphical clients.
>
> Looking at what I can see of your proposal, PHP already supports default
> values for arguments:
>
> https://www.php.net/manual/en/functions.arguments.php#functions.arguments.default
>
> ...and as of PHP 8 this can be combined with named arguments to allow
> "skipping" when calling:
>
> https://www.php.net/manual/en/functions.arguments.php#functions.named-arguments
>
> https://3v4l.org/rUGuP
>
>      function test($foo, $bar = "bardefault", $qux = "quxdefault")
>      {
>          return [$foo, $bar, $qux];
>      }
>
>      var_dump(test(foo: "foovalue", qux: "quxvalue"));
>
> This doesn't allow for declaring required parameters after optional ones
> in the functional declaration, but does allow for flexibility when
> calling while making it explicit which parameters you actually want to
> pass.
>
> While some time ago, this feature suggestion has been discussed before:
> * https://externals.io/message/105123
> * https://externals.io/message/80201
>
> (There were additional older threads I found via externals.io searches
> for "default keyword" and "parameter skip" which I've not included here)
>
> You may also want to check threads / the RFC related to named parameters
> as there may be additional discussion there.
>
>
> AllenJB
>
>
> On 14/01/2021 17:52, Andrew Brown wrote:
> > This is my first foray into PHP internals, so please let me know if
> > I'm doing something wrong. Currently just following the instructions
> > from https://wiki.php.net/rfc/howto <https://wiki.php.net/rfc/howto>.
> >
> > Currently this proposal is only a "concept".
> >
> > I propose we add a "default" keyword that can be passed as an argument
> > into a function/method call. This would allow the calling code to
> > defer to the function signature for the value of a parameter.
> >
> > Traditionally, all optional parameters are placed towards the end of
> > the function parameter list, but as we all know, sometimes this order
> > can be tricky. So if some calling code wants to override a later
> > parameter, it currently needs to pass a value to the earlier optional
> > parameters.
> >
> > A current solution around this is to define all defaults in the body
> > of the function rather than in the signature.
> >
> > Screen-Shot-2021-01-14-at-11.45.09-AM.jpg
> >
> > However, this adds some extra boilerplate, and we can't use default
> > parameters as they were really intended.
> >
> > My proposal is to add a new `default` keyword to be passed as an
> argument.
> >
> > Screen-Shot-2021-01-14-at-11.44.57-AM.jpg
> >
> > The first call of the function here is how we currently have to do
> > things. We have to explicitly pass `true` in as the second parameter.
> >
> > However, in the second call, we now use the new `default` keyword,
> > which will defer to the function signature for the default value of
> > `$param2`.
> >
> > Thanks all, looking forward to some feedback!
> >
> > --
> > Andrew M. Brown
>


-- 
Andrew M. Brown

Reply via email to