Table of Contents

PHP RFC: Constant Scalar Expressions

Introduction

This RFC brings static scalar expressions to the parser. This allows places that only take static values (const declarations, property declarations, function arguments, etc) to also be able to take static expressions.

This can allow for writing far easier to understand code, by allowing for far more expressive code.

Proposal

Adding parser support for compile-time resolved scalar expressions.

Supported Operations

The following operations are currently supported by this proposal:

Also supported is grouping static operations: (1 + 2) + 3.

Supported Operands

Constant Declarations

constant_declarations.php
<?php
const FOO = 1 + 1;
const BAR = 1 << 1;
const BAZ = "HELLO " . "WORLD!";
?>

Note that constants are not supported within a declaration (since this happens at compile time). So const BIZ = FOO << BAR; would be a compile error.

Class Constant Declarations

class_constant_declarations.php
<?php
class Foo {
    const FOO = 1 + 1;
    const BAR = 1 << 1;
    const BAZ = "HELLO " . "WORLD!";
}
?>

Class Property Declarations

class_property_declarations.php
<?php
class Foo {
    public $foo = 1 + 1;
    public $bar = [
        1 + 1,
        1 << 2,
        "foo " . 
            "bar"
    ];
    public $baseDir = __DIR__ . "/base";
}
?>

Function Argument Declarations

function_argument_declarations.php
<?php
function foo($a = 1 + 1, $b = 2 << 3) {
}
?>

Static Variable Declarations

static_variable_declarations.php
<?php
function foo() {
    static $a = 1 + 1 
    static $b = [ 1 << 2 ];    
}
?>

Backward Incompatible Changes

None

Proposed PHP Version(s)

PHP 5.NEXT

SAPIs Impacted

None

Impact to Existing Extensions

None

Impact to Opcode Caching

None, as this is a pure compile-time construct, the generated op-array is the same as if there was no expression (it's purely static).

New Constants

None

php.ini Defaults

None

Patches and Tests

An implementation based off of current master is available: Implementation On GitHub (Diff On GitHub)

This patch is ready to be merged with tests.