PHP RFC: Constant Scalar Expressions
- Version: 1.0
- Date: 2013-08-13
- Author: Anthony Ferrara ircmaxell@php.net
- Status: Withdrawn
- First Published at: http://wiki.php.net/rfc/const_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:
- + - Addition
- - - Subtraction
- * - Multiplication
- / - Division
- % - Modulus
- ! - Boolean Negation
- ~ - Bitwise Negation
- | - Bitwise OR
- & - Bitwise AND
- ^ - Bitwise XOR
- << - Bitwise Shift Left
- >> - Bitwise Shift Right
- . - Concat
Also supported is grouping static operations: (1 + 2) + 3.
Supported Operands
- 123 - Integers
- 123.456 - Floats
- “foo” - Strings
- __LINE__ - Line magic constant
- __FILE__ - File magic constant
- __DIR__ - Directory magic constant
- __TRAIT__ - Trait magic constant
- __METHOD__ - Method magic constant
- __FUNCTION__ - Function magic constant
- __NAMESPACE__ - Namespace magic constant
- <<<HEREDOC - HEREDOC string syntax
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.