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

From: Date: Tue, 17 Apr 2012 04:02:03 +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-60054@lists.php.net to get a copy of this message
So, at current, is this small enough for just a pull request, or does this deserve its own RFC? -ralph On 4/14/12 2:50 PM, Ralph Schindler wrote:
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


« previous php.internals (#60054) next »