Hi internals,

Continuing on my response in https://externals.io/message/111161#111192 , and 
considering ways to enhance named arguments without a BC break
(while minimizing the impact on application/library authors that wish for their 
libraries not to be used with named parameters)

I was considering setting up a short straw poll on the wiki for a week with two 
questions, open for a week:

1. Whether voters consider it appropriate to add amendments/enhancements to 
named parameters (in general) in php 8.0 past the feature freeze. 
(Both/Backward Compatible Enhancements Only/No)
   (yes if interested in any of the alternatives proposed in 
https://externals.io/message/111161)

   I'd recognize that named parameters are potentially a large change to what 
is considered the public API of a project,
   so I'd think continuing to add enhancements would be worthwhile, but I'd 
like to know where others stand on this.
   (e.g. if any proposals I made should be postponed to 8.1)

   I'd also think that implementing a backwards incompatible change after the 
feature freeze (in terms of impact on code targeting 8.0 alphas at the time of 
the feature freeze)
    would be a bad precedent.

2. Interest in adding support for positional-only arguments in 8.0 or 8.1 (3 
options: 8.0, 8.1, or no)

   (e.g. with a symbol such as `/` to indicate that parameters or variadic 
parameters prior to the symbol are positional-only)

   I'd consider positional-only arguments useful in some cases, such as where 
the names would always be confusing,
   (or automatically generated code)

   - `function my_merge(string $firstArg, ...string $otherArgs, /) { }`
     This also provides an easy way for user-defined code to add restrictions 
similar to what `array_merge()` already has.
   - `function my_pow($x, $y, $z = null, /,) {}`
   - `function autoGeneratedCode($arg1, $arg2, /) {}

   Other syntaxes are possible, such as using attributes
   (I would find 5 attributes rather verbose if there were 5 positional-only 
parameters),
   or keywords such as `__END_POSITIONAL_PARAMETERS`.
   Nothing stood out as a good option (e.g. `_`, `...`, `%` seem meaningless, 
`*` would be the opposite of python, `#` can't be used),
   and I've only seen markers for the end of positional-only parameters in 
python after a quick check, so at least some users would find `/` easier to 
learn/remember.

--------

On an unrelated note,

1. A few people had suggested adding a line to a README indicating that named 
parameters aren't supported.
An idea I had was to standardize on a machine-readable file format (e.g. 
".php_analysis_config.json") that IDEs/analyzers may choose to support.
It might have JSON entries such as `"supports_named_parameters": false` to 
indicate that code (e.g. src/main.php) using files in that directory (e.g. 
vendor/a/b/ with vendor/a/b/.php_analysis_config.json)
should not invoke functions/methods in vendor/a/b/ with named parameters,
because there is no guarantee the names will remain the same.
(TOML or ini settings might be more readable, but a complicated format requires 
extra dependencies and ini files won't support arrays if future settings get 
added)

- I can't think of many other settings I'd want there that aren't covered by 
composer.json, editorconfig, or other means.
  Maybe less importantly `"supports_classes_being_extended": bool`
- Alternately, it might be possible to put it in "extra" of composer.json,
  but some projects/libraries don't use composer.json (e.g. a project has both 
vendor/ and third-party/)
- I'm not aware of similar indicators for python for named arguments, so there 
might not be much interest in such a proposal. Then again, I think python had 
named arguments for much longer.

2. Another attribute idea I had was `<<ConsistentNamedParameters>>` on a 
class/method,
to make PHP enforce that method overrides other than __construct must
have the same names in the same positions and not lead to errors when valid 
named arguments are passed to subclasses,
but I don't plan to propose that any earlier than 8.1
(e.g. for classes that have calls such as `$this->method(someFlag: true);`)

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

Reply via email to