rfc:batch_use_declarations
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:batch_use_declarations [2015/01/29 16:31] – fix some code samples that had duplicated use statements marcio | rfc:batch_use_declarations [2015/01/29 23:14] – change feature name to "group use declarations" marcio | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== PHP RFC: Batch Use Declarations ====== | + | ====== PHP RFC: Group Use Declarations ====== |
* Date: 2015-01-28 | * Date: 2015-01-28 | ||
* Author: Márcio Almada, marcio.web2@gmail.com | * Author: Márcio Almada, marcio.web2@gmail.com | ||
* Status: Draft | * Status: Draft | ||
- | * First Published at: http:// | + | * First Published at: http:// |
* Patch: https:// | * Patch: https:// | ||
===== Introduction ===== | ===== Introduction ===== | ||
- | This RFC represents an attempt to improve current PHP namespace implementation by introducing the concept of **Batch Use Declarations**: | + | This RFC represents an attempt to improve current PHP namespace implementation by introducing the concept of **Group Use Declarations**: |
<code php> | <code php> | ||
- | // Proposed | + | // Proposed |
use FooLibrary\Bar\Baz\Biz { ClassA, ClassB, ClassC as Fizbo, ClassD }; | use FooLibrary\Bar\Baz\Biz { ClassA, ClassB, ClassC as Fizbo, ClassD }; | ||
Line 23: | Line 23: | ||
===== Proposal ===== | ===== Proposal ===== | ||
- | Batch use declarations, | + | Group use declarations, |
<code php> | <code php> | ||
Line 32: | Line 32: | ||
use Doctrine\Common\Collections\Expr\CompositeExpression; | use Doctrine\Common\Collections\Expr\CompositeExpression; | ||
- | // Proposed | + | // Proposed |
use Doctrine\Common\Collections\Expr { Comparison, Value, CompositeExpression }; | use Doctrine\Common\Collections\Expr { Comparison, Value, CompositeExpression }; | ||
Line 52: | Line 52: | ||
use Symfony\Component\Console\Question\ConfirmationQuestion; | use Symfony\Component\Console\Question\ConfirmationQuestion; | ||
- | // Proposed | + | // Proposed |
use Symfony\Component\Console { | use Symfony\Component\Console { | ||
Line 72: | Line 72: | ||
=== Non Mixed Use Declarations === | === Non Mixed Use Declarations === | ||
- | As expected, non mixed batch use declarations are supported: | + | As expected, non mixed group use declarations are supported: |
<code php> | <code php> | ||
Line 78: | Line 78: | ||
use function foo\math\sin, | use function foo\math\sin, | ||
- | use const foo\math\PI, | + | use const foo\math\PI, |
- | // Proposed non mixed batch use syntax: | + | // Proposed non mixed group use syntax: |
use function foo\math { sin, cos, cosh }; | use function foo\math { sin, cos, cosh }; | ||
- | use const foo\math { PI, E, GAMMA, GOLDEN_RATIO }; | + | use const foo\math { PI, E, GAMMA, GOLDEN_RATIO }; |
</ | </ | ||
=== Mixed Use Declarations === | === Mixed Use Declarations === | ||
- | Current namespace | + | |
+ | The current | ||
+ | |||
+ | Current namespace implementation does not allow mixed imports | ||
<code php> | <code php> | ||
// Current use syntax: | // Current use syntax: | ||
- | use foo\math\Math; | + | use foo\math\Math; |
- | use const foo\math\PI; | + | use const foo\math\PI; |
use function foo\math\sin, | use function foo\math\sin, | ||
- | // Proposed mixed batch use syntax: | + | // Proposed mixed group use syntax: |
use foo\math { Math, const PI, function sin, function cos, function cosh }; | use foo\math { Math, const PI, function sin, function cos, function cosh }; | ||
Line 102: | Line 105: | ||
</ | </ | ||
- | ===== About The Syntax Choice | + | ===== Justification |
- | The current choice for batch use syntax is basically a small variation from the current trait adaptation syntax: | + | |
- | < | + | Group use statements makes it easier to identify that multiple imported entities are from the same module. For the first example in this RFC, instead of having to read ' |
- | use A, B { | + | |
- | | + | Also, group use statements makes it easier to see in patch diffs that a dependency on a new module has been introduced. For instance, a patch that adds a new dependency on " |
- | | + | |
- | } | + | < |
+ | use Symfony\Component\Console\Question\ConfirmationQuestion; | ||
+ | use Symfony\Component\Console\Question\ChoiceQuestion as Choice; | ||
+ | +use Symfony\Component\Console\Question\OptionQuestion; | ||
+ | +use Symfony\Component\Consolidation\Question\OptionQuestion; | ||
+ | use Symfony\Component\Console\Question\Question; | ||
</ | </ | ||
- | Such design choice allows the feature to stay familiar and intuitive to most PHP user base. | + | With the current use syntax it's necessary to read to the 30th character of the 2nd modified line to realise that the patch adds a new dependency. The proposed syntax is much more readable: |
+ | |||
+ | < | ||
+ | use Symfony\Component\Console\Question { | ||
+ | ConfirmationQuestion, | ||
+ | ChoiceQuestion as Choice; | ||
+ | + | ||
+ | Question, | ||
+ | }; | ||
+ | +use Symfony\Component\Consolidation\Question\OptionQuestion; | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== About The Syntax Choice ===== | ||
+ | The syntax chosen is inline with the current trait adaptation syntax to make it look and feel similar to existing PHP standards. | ||
- | ===== Optional: Nested | + | ===== Optional: Nested |
**Nesting** would allow the following use case: | **Nesting** would allow the following use case: | ||
Line 140: | Line 161: | ||
===== Open Issues ===== | ===== Open Issues ===== | ||
- | * Should nested | + | * Should nested |
===== Unaffected PHP Functionality ===== | ===== Unaffected PHP Functionality ===== | ||
- | Original namespace implementation is not affected by the addition of batch use declarations. Current syntax would still be valid. | + | Original namespace implementation is not affected by the addition of group use declarations. Current syntax would still be valid. |
===== Proposed Voting Choices ===== | ===== Proposed Voting Choices ===== | ||
Line 151: | Line 172: | ||
The implementation aims to be minimal and of easy maintenance. I created a PR so that the patch diff can be viewed easily: https:// | The implementation aims to be minimal and of easy maintenance. I created a PR so that the patch diff can be viewed easily: https:// | ||
- | The current initial implementation can be found on my PHP [[https:// | + | The current initial implementation can be found on my PHP [[https:// |
===== References ===== | ===== References ===== | ||
- | There is no found record related to batch use declarations on mailing lists. | + | There is no found record related to group use declarations on mailing lists. |
==== Support in other languages ==== | ==== Support in other languages ==== |
rfc/batch_use_declarations.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1