On 2012-07-13, "Eugene Leonovich" <gen.w...@gmail.com> wrote:
> I'm a bit confused by the "class" keyword in the syntax ClassName::class.
> We already have the magic constant __CLASS__ which does exactly the same 
> class name resolving, if you refer it within the class.
>
> So why to introduce a new keyword instead of using __CLASS__, like 
> ClassName::__CLASS__?


"class" is already a keyword, making it a simpler, easier to remember, and
easier to type choice.


> "Ralph Schindler" <ra...@ralphschindler.com> wrote in message 
> news:4f89d4f1.8070...@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 
>
>


-- 
Matthew Weier O'Phinney
Project Lead            | matt...@zend.com
Zend Framework          | http://framework.zend.com/
PGP key: http://framework.zend.com/zf-matthew-pgp-key.asc

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to