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

From: Date: Sat, 14 Apr 2012 19:50:09 +0000
Subject: New Feature: Fully qualified class name resolution as scalar with class keyword
Groups: php.internals 
Request: Send a blank email to [email protected] to get a copy of this message
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

Thread (41 messages)

« previous php.internals (#59931) next »