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 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.

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