Re: New Feature: Fully qualified class name resolution as scalar with class keyword

From: Date: Sun, 15 Apr 2012 23:13:23 +0000
Subject: Re: New Feature: Fully qualified class name resolution as scalar with class keyword
References: 1  Groups: php.internals 
Request: Send a blank email to internals+get-59973@lists.php.net to get a copy of this message
2012/4/14 Ralph Schindler <ralph@ralphschindler.com>: > Hi all, > > There are many different use cases were in code we expect classes names as > arguments to functions as fully qualified names.  We do this in ZF a lot > with our Service Location and DI components, but also with our code > reflection API, etc.  A more interesting use case I would like to call out > is with PHPUnit, for example in a test, you might find this: > >  $mock = $this->getMock('A\Namespaced\ClassName'); > > This becomes cumbersome when you are dealing with lots of strings about lots > of class names.  This is also an area where, currently, namespace > declaration and use statements offer no real support. > > The patch located here: > > > https://github.com/ralphschindler/php-src/commit/02210d51851a96d723fbedcfc64cde9f9ae2b22a > > ... implements the ability for a developer to leverage the file's namespace > declaration and use statements to be able to produce a scalar (string) of > the class name that can be then used, for example, as an argument to a > function elsewhere. > > This overloads the "class" keyword, and by virtue of the existing usage of > "class" this feature is completely backwards compatible.  All existing tests > pass.  For example, the above PHPUnit snipped would become: > >  use A\Namespaced\ClassName; >  $mock = $this->getMock(ClassName::class); > > Another example with reflection: > >  use SomeOther\FullyNamespaced\ClassElsewhere as CE; >  $r = new ReflectionClass(CE::class); > > More examples from the test file: > >  namespace Foo\Bar { >    class Baz {} >    var_dump(Moo::CLASS); // "Foo\Bar\Moo" >  } > >  namespace { >    use Bee\Bop as Moo, >        Foo\Bar\Baz; > >    var_dump(Baz::class); // "Foo\Bar\Baz" >    var_dump(Boo::class); // "Boo" >    var_dump(Moo::CLASS); // "Bee\Bop" >    var_dump(\Moo::Class); // "Moo" > >    $class = Baz::class; // assign class as scalar to var >    $x = new $class; >    var_dump($x);  object(Foo\Bar\Baz)#1 (0) {} >  } > > > What do you guys think? > > -ralph > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > Hi, Ralph I really like this feature in general. One thing I personally dislike in this implementation is the difference between CLASS and class ... One with and one without namespaces ... If we can unify that, this would be a great help in understanding that feature in future and getting the difference while reading code. And please don't forget: Code will be written once, maybe rewritten some times, but it will be read way more times! Bye Simon

« previous php.internals (#59973) next »