rfc:batch_use_declarations

This is an old revision of the document!


PHP 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, ClassD };
 
// Compared to current use syntax:
 
use FooLibrary\Bar\Baz\Biz\ClassA;
use FooLibrary\Bar\Baz\Biz\ClassB;
use FooLibrary\Bar\Baz\Biz\ClassC;
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;
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,
  Question\ConfirmationQuestion,
};

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:

use foo\math { const PI, function sen, function cos }

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

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: https://github.com/marcioAlmada/php-src/tree/batch-use

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:

- http://www.rust-lang.org has a very similar sintax `use a::b::{c,d,e,f};` - https://www.python.org/ has a different syntax but with the same objective: `from fibo import fib, fib2, fib3`

Rejected Features

Awaiting discussion.

rfc/batch_use_declarations.1422482868.txt.gz · Last modified: 2017/09/22 13:28 (external edit)