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
Last revisionBoth sides next revision
rfc:class_name_scalars [2012/09/11 20:18] – [Real World Usage Scenarios] udpated ralphschindlerrfc:class_name_scalars [2013/01/19 01:50] nikic
Line 3: Line 3:
   * Date: 2012-04-17   * Date: 2012-04-17
   * Author: Ralph Schindler <ralph.at.ralphschindler.com>   * Author: Ralph Schindler <ralph.at.ralphschindler.com>
-  * Status: Voting+  * Status: Implemented in PHP 5.5
   * First Published at: http://wiki.php.net/rfc/class_name_scalars   * First Published at: http://wiki.php.net/rfc/class_name_scalars
  
Line 97: Line 97:
  
 <code php> <code php>
 +
 +--TEST--
 +class name as scalar from ::class keyword
 +--FILE--
 <?php <?php
  
 namespace Foo\Bar { namespace Foo\Bar {
-    class Baz {} +    class One { 
-    var_dump(Moo::class); // resolve in namespace +        // compile time constants 
-    class Box +        const A = self::class; 
-        public static function registerClassName($class = Baz::class) { +        const B = Two::class; 
-            var_dump($class);+    
 +    class Two extends One { 
 +        public static function run() { 
 +            var_dump(self::class); // self compile time lookup 
 +            var_dump(static::class); // runtime lookup 
 +            var_dump(parent::class); // runtime lookup 
 +            var_dump(Baz::class); // default compile time lookup 
 +        } 
 +    } 
 +    class Three extends Two { 
 +        // compile time static lookups 
 +        public static function checkCompileTime( 
 +            $one = self::class
 +            $two = Baz::class
 +            $three = One::A, 
 +            $four = self::B 
 +        ) { 
 +            var_dump($one, $two, $three, $four);
         }         }
     }     }
-    Box::registerClassName();+    echo "In NS\n"; 
 +    var_dump(Moo::CLASS); // resolve in namespace
 } }
  
 namespace { namespace {
     use Bee\Bop as Moo,     use Bee\Bop as Moo,
-        Foo\Bar\Baz+        Foo\Bar\One; 
-    var_dump(Baz::class); // resolve from use+    echo "Top\n"
 +    var_dump(One::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 = One::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
-    var_dump($x);    +    var_dump($x); 
 +    Foo\Bar\Two::run(); // resolve runtime lookups 
 +    echo "Parent\n"; 
 +    Foo\Bar\Three::run(); // resolve runtime lookups with inheritance 
 +    echo "Compile Check\n"; 
 +    Foo\Bar\Three::checkCompileTime();
 } }
- 
  
 ?> ?>
---EXPECTF--    +--EXPECTF-- 
 +In NS
 string(11) "Foo\Bar\Moo" string(11) "Foo\Bar\Moo"
-string(11) "Foo\Bar\Baz" +Top 
-string(11) "Foo\Bar\Baz"+string(11) "Foo\Bar\One"
 string(3) "Boo" string(3) "Boo"
 string(7) "Bee\Bop" string(7) "Bee\Bop"
 string(3) "Moo" string(3) "Moo"
-object(Foo\Bar\Baz)#1 (0) {+object(Foo\Bar\One)#1 (0) {
 } }
 +string(11) "Foo\Bar\Two"
 +string(11) "Foo\Bar\Two"
 +string(11) "Foo\Bar\One"
 +string(11) "Foo\Bar\Baz"
 +Parent
 +string(11) "Foo\Bar\Two"
 +string(13) "Foo\Bar\Three"
 +string(11) "Foo\Bar\One"
 +string(11) "Foo\Bar\Baz"
 +Compile Check
 +string(13) "Foo\Bar\Three"
 +string(11) "Foo\Bar\Baz"
 +string(11) "Foo\Bar\One"
 +string(11) "Foo\Bar\Two"
 </code> </code>
  
Line 144: Line 186:
   * <del>Resolve as best as possible, meaning error in non-class context, do a runtime lookup in a class context</del>   * <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)+**Note:** (as of 1/18/13)
  
 In the current patch, the following resolutions take place: In the current patch, the following resolutions take place:
Line 150: Line 192:
   * static::class resolves the same as get_called_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.)   * parent::class resolves the same as get_parent_class() would, (in fact, would return false if not inherited.)
 +  * static::class & parent::class when used in compile-time only places (like method signatures), will throw an exception
  
  
Line 159: Line 202:
  
  
-<doodle title="Should the ::class feature be merged to master?" auth="ralphschindler" voteType="single" closed="false">+<doodle title="Should the ::class feature be merged to master?" auth="ralphschindler" voteType="single" closed="true">
    * Yes    * Yes
    * No    * No
 </doodle> </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 =====
  
   * 2012-04-17 Initially created by Ralph Schindler   * 2012-04-17 Initially created by Ralph Schindler
   * 2012-09-08 Updated RFC and added link to Pull Request (which addresses considerations and on-list questions)   * 2012-09-08 Updated RFC and added link to Pull Request (which addresses considerations and on-list questions)
 +  * 2013-01-18 Updated RFC to reflect design decisions, updated the test/example
  
rfc/class_name_scalars.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1