rfc:class_name_scalars

Differences

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

Link to this comparison view

rfc:class_name_scalars [2012/09/11 15:09]
ralphschindler [Considerations]
rfc:class_name_scalars [2017/09/22 13:28]
Line 1: Line 1:
-====== Request for Comments: Class Name Resolution As Scalar Via "class" Keyword ====== 
-  * Version: 1.0 
-  * Date: 2012-04-17 
-  * Author: Ralph Schindler <ralph.at.ralphschindler.com> 
-  * Status: Voting 
-  * First Published at: http://wiki.php.net/rfc/class_name_scalars 
- 
-===== Introduction ===== 
- 
-This RFC proposes to add a new ''ClassName::class'' syntax, which provides the fully qualified class name as a string. 
- 
-===== Use case ===== 
- 
-Class names in strings have to be fully qualified in PHP. It is not possible to utilize aliases registered through ''use'' statements: 
- 
-<code php> 
-use A\Namespaced\ClassName; 
- 
-// this will try to create a mock of the global class ClassName, not 
-// of the aliased class A\Namespaced\ClassName 
-$mock = $this->getMock('ClassName'); 
-</code> 
- 
-''ClassName::class'' allows the programmer to easily obtain the fully qualified class name from an aliased name: 
- 
-<code php> 
-use A\Namespaced\ClassName; 
- 
-// ClassName::class resolves to 'A\Namespaced\ClassName' 
-$mock = $this->getMock(ClassName::class); 
-</code> 
- 
-===== Choice of syntax ===== 
- 
-The ''ClassName::class'' syntax was chosen because it can not clash with existing constants (as ''class'' is a keyword). The feature addition thus is fully backwards compatible. 
- 
-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 ===== 
- 
-From the test for the feature: 
- 
-<code php> 
-<?php 
- 
-namespace Foo\Bar { 
-    class Baz {} 
-    var_dump(Moo::class); // resolve in namespace 
-    class Box { 
-        public static function registerClassName($class = Baz::class) { 
-            var_dump($class); 
-        } 
-    } 
-    Box::registerClassName(); 
-} 
- 
-namespace { 
-    use Bee\Bop as Moo, 
-        Foo\Bar\Baz; 
-    var_dump(Baz::class); // resolve from use 
-    var_dump(Boo::class); // resolve in global namespace 
-    var_dump(Moo::class); // resolve from use as 
-    var_dump(\Moo::class); // resolve fully qualified 
-    $class = Baz::class; // assign class as scalar to var 
-    $x = new $class; // create new class from original scalar assignment 
-    var_dump($x);     
-} 
- 
- 
-?> 
---EXPECTF--     
-string(11) "Foo\Bar\Moo" 
-string(11) "Foo\Bar\Baz" 
-string(11) "Foo\Bar\Baz" 
-string(3) "Boo" 
-string(7) "Bee\Bop" 
-string(3) "Moo" 
-object(Foo\Bar\Baz)#1 (0) { 
-} 
-</code> 
- 
-===== Considerations ===== 
- 
-One situation in need of a solution is what to do with ''self::class'', ''static::class'', and ''parent::class'' 
- 
-Do we: 
- 
-  * <del>Throw a compile error?</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) 
- 
-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 ===== 
- 
-* 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="false"> 
-   * Yes 
-   * No 
-</doodle> 
- 
-===== Changelog ===== 
- 
-  * 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) 
  
rfc/class_name_scalars.txt · Last modified: 2017/09/22 13:28 (external edit)