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
rfc:class_name_scalars [2012/09/14 15:15] – [Vote] ralphschindlerrfc:class_name_scalars [2017/09/22 13:28] (current) – external edit 127.0.0.1
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 169: Line 212:
   * 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.1347635745.txt.gz · Last modified: 2017/09/22 13:28 (external edit)