rfc:class_name_scalars

This is an old revision of the document!


Request for Comments: Class Name Resolution As Scalar Via "class" Keyword

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) {
}

Patch

Changelog

* 2012-04-17 Initially created by Ralph Schindler

rfc/class_name_scalars.1334677574.txt.gz · Last modified: 2017/09/22 13:28 (external edit)