Re: Re: [RFC][Proposal] Renamed parameters

From: Date: Tue, 28 Jul 2020 04:33:56 +0000
Subject: Re: Re: [RFC][Proposal] Renamed parameters
References: 1 2 3  Groups: php.internals 
Request: Send a blank email to internals+get-111207@lists.php.net to get a copy of this message
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

« previous php.internals (#111207) next »