This is an old revision of the document!
PHP RFC: Power Operator
- Version: 0.1
- Date: 2013-11-23
- Author: Tjerk Meesters, datibbaw@php.net
- Status: Under Discussion
- First Published at: http://wiki.php.net/rfc/pow-operator
Introduction
This proposal is two-fold:
- Turn the existing pow() function into a language construct.
- Avoids a function call.
- Support for GMP overloading.
- Introduce an exponential (right associative) operator
**
and**=
.- Easier to read and shorter to write.
- Can be found in other languages.
Proposal
pow() as language construct
No changes to existing code, safe for one:
var_dump(pow([], 2)); // int(0) instead of float(0)
Power operator
A short working example:
echo 2 ** 3; // 8
It supports GMP overloading:
$base = gmp_init(2); $exponent = 3; var_dump($base ** $exponent); // output object(GMP)#3 (1) { ["num"]=> string(1) "8" }
Example of exponent assignment:
$x = 2; $x **= 3; echo $x; // 8
Important
The proposed associativity is right, just like how power towers work.
The operator precedence is:
- higher than the bitwise not (~) and
- lower than array dereferencing.
Examples:
echo 2 ** 3 ** 2; // 512 (not 64) echo -3 ** 2; // -9 (not 9) echo ~3 ** 2; // -10 (not 16)
Discussion
Shouldn't-3 ** 2
be evaluated as(-3) ** 2
to avoid confusion?
This would be possible by giving the unary minus a higher precedence than **
, as seen in ColdFusion (for instance). Doing this would result in the following behaviour:
-3 ** 2 // 9 1 -3 ** 2 // -8
However, the bare notation violates mathematical laws and thus will not be added to the proposal.
Should2 ** 3 ** 2
yield64
(left associative),512
(right associative) or throw an error (non associative)?
The exponent operator evaluation order should be based on Tetration and therefore be right associative.
Languages with left associative exponential operator
- VB (not by choice imho)
- Basic
- Octave
- Matlab
- D
- ColdFusion
Languages with right associative exponential operator
- Haskell
- R
- F#
- Ruby
- Perl
- Python
- Mathematica
- Freemat
- Scilab
- Tcl (changed from left associative!)
- Cobol
- Fortran
- Sage
- Bash
Languages with non associative exponential operator
- Ada
Sources
- http://www.nku.edu/~foxr/CSC407/NOTES/ch7.ppt (second slide)
Proposed PHP Version(s)
PHP 5.6
Impact to Existing Extensions
The opcode ZEND_POW <165>
and ZEND_ASSIGN_POW <166>
is added.
External extensions such as vld or phpdbg would have to be updated, but I'm not aware of any core extensions that would otherwise be affected.
Open Issues
None.
Proposed Voting Choices
Voting will be based on the following:
- Turn
pow()
into a language construct, - Add the power operators
**
and**=
, - Add
ZEND_POW
andZEND_ASSIGN_POW
opcodes.
Patches and Tests
Power operator PR: https://github.com/php/php-src/pull/543