On Fri, Feb 13, 2015 at 5:24 PM, Nikita Popov <nikita....@gmail.com> wrote:
> On Wed, Feb 11, 2015 at 9:50 PM, Marcio Almada <marcio.w...@gmail.com> > wrote: > >> Hi internals! >> >> Since no new discussion topics appeared, the voting on the Group Use >> Declarations RFC for PHP7 is now open: >> >> RFC: https://wiki.php.net/rfc/group_use_declarations#votes >> Patch: https://github.com/php/php-src/pull/1005 >> >> As requested I've split the vote into two slightly different syntax >> choices, so be sure to pick the right choice if you are going to vote yes. >> The voting will close in exactly 14 days counting from now. >> > > I'm in favor of this RFC. Honestly I don't really understand the > negativity it is getting around here. > > The ability to import multiple items from one namespace is a > well-established feature you'll find in many languages employing some kind > of namespacing. I don't think the availability of what I lovingly call "IDE > vomit" is a good reason to decline a feature - a programming language > should be able stand on its own and not require IDE assistance for > reasonable use. > > The syntax seems pretty obvious as well - but maybe I just had too much > exposure to Rust, which makes extensive use of the same syntax. > I'd like to follow up with another point. I've seen multiple people claim that code that requires so many "use"s that this proposal becomes relevant violates the single responsibility principle, because it simply uses too many different classes. I don't think that this statement is correct and would like to provide an example. The responsibility of the NameResolver class [1] from the php-parser project is to resolve all names to be fully qualified where possible (which sounds reasonably narrow to me). However in order to do this it must consider a large number of different AST nodes, so that the full import list (if you individually import every class, which is customary in PHP) would look as follows: use PhpParser\NodeVisitorAbstract; use PhpParser\Error; use PhpParser\Node; use PhpParser\Node\Name; use PhpParser\Node\Name\FullyQualified; use PhpParser\Node\Stmt\Namespace_; use PhpParser\Node\Stmt\Use_; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\Interface_; use PhpParser\Node\Stmt\Trait_; use PhpParser\Node\Stmt\Function_; use PhpParser\Node\Stmt\Const_; use PhpParser\Node\Stmt\Catch_; use PhpParser\Node\Stmt\TraitUse; use PhpParser\Node\Stmt\TraitUseAdaptation\Precedence; use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Expr\ClassConstFetch; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\Instanceof_; use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\ConstFetch; Damn, this looks unwieldy. With this proposal it becomes: use PhpParser\{NodeVisitorAbstract, Error, Node}; use PhpParser\Node\{Name, Name\FullyQualified}; use PhpParser\Node\Stmt\{ Namespace_, Use_, Class_, Interface_, Trait_, Function_, Const_, Catch_, TraitUse, TraitUseAdaptation\Precedence}; use PhpParser\Node\Expr\{ StaticCall, StaticPropertyFetch, ClassConstFetch, New_, Instanceof_, FuncCall, ConstFetch}; Which in my eyes is a much cleaner. There are simply some things that require interacting with a lot of different classes - processing a syntax tree is one of those. Lastly I would also encourage everyone to see beyond the usual object-oriented mindset. PHP is a multi-paradigm language and object- or class-oriented code are not the end of the line. While, by convention, PHP uses a 1-to-1 mapping for classes to files, this is not at all common for functional and functional-ish code. If you write function-based libraries you will define many functions in one file, which will again make use of many other functions (which are preferably imported). As such you can end up with many imports without any SRP violation. Thanks, Nikita [1] https://github.com/nikic/PHP-Parser/blob/master/lib/PhpParser/NodeVisitor/NameResolver.php