Request for Comments: Enhance Namespace Batch Importing Syntax
- Version: 1.0
- Date: 2012-07-24
- Author: Reeze Xia reeze@php.net
- Status: Under Discussion
- First Published at: https://wiki.php.net/rfc/namespace-importing-with-from
Introduction
This RFC proposes adding a new syntax
from TopNamespace use Subnamespace as alias, Subnamespace2, Subnamespace3 as alias3;
This syntax is used to import multiple symbols from a common namespace cleanly. It will make namespace importing easier and reduce deplication.
Use case
When importing multiple class/constant/function from a top namespace, we have to duplicate the top level namespace multiple times.
<?php use GlobalNamespace\SubSpace\ThirdSpace\Class1; use GlobalNamespace\SubSpace\ThirdSpace\Class2; use GlobalNamespace\SubSpace\ThirdSpace\ForthSpace\Class3;
This is hard to maintain and type, especially when the namespace is deep.
This RFC proposes a new syntax to allow developers reduce duplication as below:
<?php from GlobalNamespace\SubSpace\ThirdSace use Class1, Class2, ForthSpace\Class3;
It will be an equivalent to the previous multiple use statements. This makes code less and easier to maintain.
We could import by combine multiple use statement to a single line.
<?php use Top\Namespaced\ClassA, Top\Namespaced\ClassB, Top\Namespaced\ClassC;
but it didn't reduce duplication indeed.
Syntax explain
This proposed RFC syntax introduce a new keyword: from
.
The syntax is from topnamespace use subns_class_func_cons [as alias] [, another_subns_class_func_cons [as alias] ...]
In short this syntax enable develpers import several symbols from the same namespace once.
'topnamespace' could be considered as a prefix to every follow use statement:
<?php from Top\Namespaced use ClassA, ClassB, ClassC; // equals(expand) to use Top\Namespaced\ClassA; use Top\Namespaced\ClassB; use Top\Namespaced\ClassB; // we can also import from a higher level from \GlobalNS\Company\Tools use \Tool1, use SubCollection\NewTool as MyTool;
We could also import from global namespace by prefix with backslash. but we could only
prefix backslash before the namespace after from
, the namespace after use
statement
could either, but it will not import from global namespace, since it's known to be a subnamespace.
Why ''from''?
It was inspired by Python, it use from xxx import yyy as zzz
,
it's easy to understand what from
means, eg: “use those classes from the namespace”.
since PHP use use
keyword to import symbol,
so from namespace_ns use sub_namespace_or_symbol as alias
is choosen.
Can we ''use *'' to import?
No 'use' itself didn't and from use syntax didn't either.
More examples
<?php namespace A { class B {} } namespace A\C { class X {} class Y {} } namespace { /* * use A\B */ from A use B; /* * use A\B as B1; * use A\B as B2; */ from A use B as B1, B as B2, C\X as X0; /* * use A\C\X; * use A\C\Y; */ from A\C use X, Y; /* * use \A\C\X as X1; * use \A\C\Y as Y1; */ from \A\C use \X as X1, Y as Y1; $b = new B(); $b1 = new B1(); $b2 = new B2(); $x = new X(); $x1 = new X1(); $y = new Y(); $y1 = new Y1(); var_dump($b, $b1, $b2, $x, $x1, $y, $y1); echo "===DONE===\n"; } ?> --EXPECTF-- object(A\B)#1 (0) { } object(A\B)#2 (0) { } object(A\B)#3 (0) { } object(A\C\X)#4 (0) { } object(A\C\X)#5 (0) { } object(A\C\Y)#6 (0) { } object(A\C\Y)#7 (0) { } ===DONE===
Patch
* Patch located here: https://github.com/reeze/php-src/compare/rfc-from-use
Changelog
* 2012-07-24 Initially created by Reeze Xia