This is an old revision of the document!
PHP RFC: Batch Use Declarations
- Date: 2015-01-28
- Author: Márcio Almada, marcio.web2@gmail.com
- Status: Draft
- First Published at: http://wiki.php.net/rfc/batch_use_declarations
Introduction
This RFC represents an attempt to improve current PHP namespace implementation by introducing the concept of Batch Use Declarations:
// Proposed batch use syntax: use FooLibrary\Bar\Baz\Biz { ClassA, ClassB, ClassC as Fizbo, ClassD }; // Compared to current use syntax: use FooLibrary\Bar\Baz\Biz\ClassA; use FooLibrary\Bar\Baz\Biz\ClassB; use FooLibrary\Bar\Baz\Biz\ClassC as Fizbo; use FooLibrary\Bar\Baz\Biz\ClassD;
Proposal
Batch use declarations, also known as grouped imports, are just syntax sugar to cut verbosity when importing multiple entities from a common namespace. Using common PHP library examples, the following use declarations are equivalents:
// Current use syntax: use Doctrine\Common\Collections\Expr\Comparison; use Doctrine\Common\Collections\Expr\Value; use Doctrine\Common\Collections\Expr\CompositeExpression; // Proposed batch use syntax: use Doctrine\Common\Collections\Expr { Comparison, Value, CompositeExpression };
Compound Namespaces
Compound namespaces are also allowed. For instance, the following use declarations are equivalents:
// Current use syntax: use Symfony\Component\Console\Helper\Table; use Symfony\Component\Console\Input\ArrayInput; use Symfony\Component\Console\Output\NullOutput; use Symfony\Component\Console\Question\Question; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\ChoiceQuestion as Choice; use Symfony\Component\Console\Question\ConfirmationQuestion; // Proposed batch use syntax: use Symfony\Component\Console { Helper\Table, Input\ArrayInput, Input\InputInterface, Output\NullOutput, Output\OutputInterface, Question\Question, Question\ChoiceQuestion as Choice, Question\ConfirmationQuestion, };
Non Mixed Use Declarations
As expected, non mixed batch use declarations are supported:
// Current use syntax: use const foo\math\PI, foo\math\PI, foo\math\E, foo\math\GAMMA, foo\math\GOLDEN_RATIO; use function foo\math\sin, foo\math\cos, foo\math\cosh; // Proposed non mixed batch use syntax: use function foo\math { sin, cos, cosh }; use const foo\math { PI, E, GAMMA, GOLDEN_RATIO };
Mixed Use Declarations
Current namespace implementation does not allow mixed imports of functions, constants and classes. With the approval of this RFC, for completeness, the following hypothetical mixed imports would be possible:
// Current use syntax: use const foo\math\PI; use function foo\math\sin, foo\math\cos, foo\math\cosh use foo\math\Math; // Proposed mixed batch use syntax: use foo\math { const PI, function sin, function cos, function cosh, Math };
About The Syntax Choice
The current choice for batch use syntax is basically a small variation from the current trait adaptation syntax:
use A, B { B::smallTalk insteadof A; A::bigTalk insteadof B; }
Such design choice allows the feature to stay familiar and intuitive to most PHP user base.
Optional: Nested Batch Use Declarations
Nesting would allow the following use case:
use Symfony\Component\Console { Helper\Table, Input { ArrayInput, InputInterface } Output { NullOutput, OutputInterface }, Question { Question, ChoiceQuestion, ConfirmationQuestion } };
As the author of this RFC, I consider the nesting option too complex to be introduced. But since many people mentioned this possibility, it will be put into the discussion so the community has a chance to appoint.
Backward Incompatible Changes
There is no BC breaks with current implementation or feature concepts.
Proposed PHP Version(s)
This is proposed for the next PHP x, which at the time of this writing would be PHP 7.
RFC Impact
On Backward Compatibility
This RFC is backwards compatible with previous PHP releases.
Open Issues
- Should nested batch use declarations be allowed?
Unaffected PHP Functionality
Original namespace implementation is not affected by the addition of batch use declarations. Current syntax would still be valid.
Proposed Voting Choices
As this RFC represents a language change a two third majority is required.
Patches and Tests
The implementation aims to be minimal and of easy maintenance. It consists of a single pass of AST decoration before zend_compile_use.
I created a PR so that the patch diff can be viewed easily: https://github.com/php/php-src/pull/1005
The current initial implementation can be found on my PHP fork. You can also directly contribute to this RFC by sending a pull request to https://github.com/marcioAlmada/RFCs.
References
There is no found record related to batch use declarations on mailing lists.
Support in other languages
Other languages have similar ways to import multiple entities from a given package or module:
- Rust Language has a very similar sintax `use a::b::{c,d,e,f};`
- Pyhon has a different syntax but with the same objective: `from fibo import fib, fib2, fib3`
Rejected Features
Awaiting discussion.