I used to implement `public static function getClass() { return
get_called_class(); }`, so I really like this one, makes it also easier for
IDEs when refactoring code :)
I was wondering about class A { const CLASS = 'hello'; }
but that would
cause an unexpected T_CLASS
, so I guess there's no conflicts...
Marco Pivetta
http://twitter.com/Ocramius
http://marco-pivetta.com
On 14 April 2012 21:50, Ralph Schindler <[email protected]> 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/**
> 02210d51851a96d723fbedcfc64cde**9f9ae2b22a<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
>
>