rfc:class_name_scalars

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
rfc:class_name_scalars [2012/09/08 05:49] – Updates for PR and considerations ralphschindlerrfc:class_name_scalars [2012/09/14 15:16] – [Request for Comments: Class Name Resolution As Scalar Via class Keyword] ralphschindler
Line 31: Line 31:
 </code> </code>
  
 +==== Real World Usage Scenarios ====
 +
 +1. PHPUnit's Mocking
 +
 +<code php>
 +
 +use MyVendor\SomeComponent\TargetSubNs;
 +
 +// inside a test case
 +$this->getMock(TargetSubNs\Foo::class);
 +// as opposed to
 +$this->getMock('MyVendor\SomeComponent\TargetSubNs\Foo');
 +</code>
 +
 +2. Doctrine
 +
 +<code php>
 +
 +use MyVendor\SomeComponent\TargetEntityNs as Entity;
 +
 +// inside a test case
 +$entityManager->find(Entity\User::class, 5);
 +// as opposed to
 +$entityManager->find('MyVendor\SomeComponent\TargetEntityNs\User', 5);
 +
 +</code>
 +
 +3. Any Real (auto-wiring || auto-instantiating) Dependency Injection Container
 +
 +<code php>
 +
 +use MyVendor\SomeComponent\TargetNs as T;
 +
 +// inside a test case
 +$dic->newInstance(T\Foo::class);
 +// as opposed to
 +$dic->newInstance('MyVendor\SomeComponent\TargetEntityNs\Foo');
 +
 +</code>
 +
 +4. General PHP Usage:
 +
 +<code php>
 +
 +use MyVendor\SomeComponent\TargetNs as T;
 +
 +// reflection
 +$r = new ReflectionClass(T\Foo::class); // instead of new ReflectionClass('MyVendor\SomeComponent\TargetNs\Foo');
 +
 +// class_exists, also applies to any php function that takes a class name (is_subclass_of, get_class_methods, etc)
 +if (class_exists(T\Foo::class, true)) {} // instead of class_exists('MyVendor\SomeComponent\TargetNs\Foo')
 +
 +</code>
 ===== Choice of syntax ===== ===== Choice of syntax =====
  
Line 36: Line 89:
  
 Furthermore the syntax resembles the semantically equivalent Java syntax ''ClassName.class''. Furthermore the syntax resembles the semantically equivalent Java syntax ''ClassName.class''.
 +
 +Note: since this feature reuses T_CLASS/class keyword, it is case-insensitive.  Therefore, Foo::class is semantically equivalent to Foo::Class, Foo::CLASS and the like.
  
 ===== More examples ===== ===== More examples =====
Line 46: Line 101:
 namespace Foo\Bar { namespace Foo\Bar {
     class Baz {}     class Baz {}
-    var_dump(Moo::CLASS); // resolve in namespace+    var_dump(Moo::class); // resolve in namespace
     class Box {     class Box {
         public static function registerClassName($class = Baz::class) {         public static function registerClassName($class = Baz::class) {
Line 60: Line 115:
     var_dump(Baz::class); // resolve from use     var_dump(Baz::class); // resolve from use
     var_dump(Boo::class); // resolve in global namespace     var_dump(Boo::class); // resolve in global namespace
-    var_dump(Moo::CLASS); // resolve from use as +    var_dump(Moo::class); // resolve from use as 
-    var_dump(\Moo::Class); // resolve fully qualified+    var_dump(\Moo::class); // resolve fully qualified
     $class = Baz::class; // assign class as scalar to var     $class = Baz::class; // assign class as scalar to var
     $x = new $class; // create new class from original scalar assignment     $x = new $class; // create new class from original scalar assignment
Line 86: Line 141:
 Do we: Do we:
  
-  * Throw a compile error? +  * <del>Throw a compile error?</del> 
-  * Resolve as best as possible, meaning error in non-class context, do a runtime lookup in a class context+  * <del>Resolve as best as possible, meaning error in non-class context, do a runtime lookup in a class context</del> 
 + 
 +**Note:** (as of 9/8/12) 
 + 
 +In the current patch, the following resolutions take place: 
 +  * self::class resolves the same as %%__CLASS__%% would 
 +  * static::class resolves the same as get_called_class() would 
 +  * parent::class resolves the same as get_parent_class() would, (in fact, would return false if not inherited.) 
  
 ===== Patch ===== ===== Patch =====
  
 * Pull Request located here: https://github.com/php/php-src/pull/187/files * Pull Request located here: https://github.com/php/php-src/pull/187/files
 +
 +===== Vote =====
  
  
 +<doodle title="Should the ::class feature be merged to master?" auth="ralphschindler" voteType="single" closed="true">
 +   * Yes
 +   * No
 +</doodle>
  
 +Note: This Vote has been closed as the RFC will be moved back to discussion at the time being while the RFC and associated patch become more mature.
 ===== Changelog ===== ===== Changelog =====
  
rfc/class_name_scalars.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1