This is an old revision of the document!
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: Under Discussion
- 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:
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');
ClassName::class
allows the programmer to easily obtain the fully qualified class name from an aliased name:
use A\Namespaced\ClassName; // ClassName::class resolves to 'A\Namespaced\ClassName' $mock = $this->getMock(ClassName::class);
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
.
More examples
From the test for the feature:
<?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) { }
Considerations
One situation in need of a solution is what to do with self::class
, static::class
, and parent::class
Do we:
- Throw a compile error?
- Resolve as best as possible, meaning error in non-class context, do a runtime lookup in a class context
Patch
* Pull Request located here: https://github.com/php/php-src/pull/187/files
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)