On Mon Sep 2 08:52 AM, Sebastian Krebs wrote:
> 2013/9/2 Pierre Joye <pierre....@gmail.com>
> 
> > >
> > > Any comments or feedback on the RFCs and the code are welcome,
> > > especially pointing out the cases where it may not work (which means
> > > we need more phpt's there :)
> >
> > Using default instead of ,,, is indeed much more readable.
> >
> > However I still wonder what prevents to finally implement named
> > parameters too, it will provide the same feature while being even more
> > handy and easier.
> 
> 
> And it covers an additional use-case: Self-explaning parameters like in
> "foo(is_strict = false)" instead of "foo(null, null, false)".
> 
> 

Lots of overlap between variadic functions, this proposal & named parameters.

A popular use case for library authors is to use:

interface foo {
  function formatUseCases(array $options);
}
- Advantage: No dependency on a class / object
- Disadvantage: doesn't document what options are available, hard to extend 
'default parameters'

interface foo {
  function formatUseCases(MyOptions $options);
}
- Advantage: documents which options are available, easy to extend default 
parameters
- Disadvantage: modification of the object means these 'options' are available 
to any declaration using it, hard to maintain over time without big refactoring 
(lots of options objects)

interface foo {
  function formatUseCases(...$options);
}
- Advantage: No dependency on a class / object
- Disadvantage: doesn't document what options are available, no default 
parameters

interface foo {
  function formatUseCases($showGood = true, $showBad = true, $pretty = true, 
$title= "what are these parameters?");
}
- Advantage: Self-documenting with default parameters
- Disadvantage: Not extendable api signature (changing default parameters)

- Readability:

# array
formatUseCases(['showGood': true, 'showBad': true, 'pretty': true]);

#object
$obj->showGood = true;
$obj->showBad = true;
$obj->pretty = true;
formatUseCases($obj);

# variadic or function declaration
formatUseCases(true, true, true, "what are these parameters?");

- Solution somewhat as a hybrid?
interface foo {
  function formatUseCases(...$options[showGood = true, showBad = true, pretty = 
true, title= "what are these parameters?"]);
}

formatUseCases(true, true, true, "use defaults for everything else");
formatUseCases(['title': "use defaults for everything else"]); // more readable

Implemention wise $options could be ~ SplParameters which implements 
ArrayInterface :

class bar implements foo {
  function formatUseCases(...$options[]) { // api signature as $options[] 
always accepted (uses default params)
        echo get_class($options); // SplParameters
        var_dump($options['showGood']) // true;
        var_dump($options->showGood) // true;
  }
}

class bar2 implements foo {
  function formatUseCases(...$options[showGood = false]) { // easy to extend 
default options
        var_dump($options['showGood']) // false;
  }
}

Why use special syntax ~ "...$options[]" instead of just named parameters:
http://msdn.microsoft.com/en-us/library/dd264739.aspx

My hunch is that applying named parameters to every function would be very 
costly in PHP. But as a special syntax applied to a few functions, this might 
work well.


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

Reply via email to