Power Operator
- Currently implemented
- Target version: 5.6
- Approved at 71.9%
Contents
PHP RFC: Power Operator
- Version: 0.3
- Date: 2013-11-23
- Author: Tjerk Meesters, datibbaw@php.net
- Status: Implemented in PHP 5.6
- First Published at: http://wiki.php.net/rfc/pow-operator
- Revision (0.1 → 0.2): 2013-12-19
- Revision (0.2 → 0.3): 2013-12-21
Introduction
This proposal is two-fold:
- Introduce an exponential (right associative) operator
**
.- Avoids a function call.
- Support for GMP overloading.
- Easier to read and shorter to write.
- Can be found in other languages.
- Introduce an exponential assignment operator
**=
Proposal
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 unary minus,
- lower than array dereferencing.
Examples:
echo 2 ** 3 ** 2; // 512 (not 64)
echo -3 ** 2; // -9 (not 9)
echo 1 - 3 ** 2; // -8
echo ~3 ** 2; // -10 (not 16)
Discussion
Should-3 ** 2
evaluate to9
instead of-9
?
According to the following resources, the scale tips more towards having the exponent precede the unary minus:
Similar languages
- Ada
- D
- F#
- Fortran
- Freemat
- Haskell
- Mathematica / Matlab / Scilab
- Octave
- Perl
- Python
- R
- Ruby
- Sage
- VB / Basic
Dissimilar languages
- Bash
- Cobol
- ColdFusion
- Excel
- Tcl
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
- ColdFusion
Languages with right associative exponential operator
- D
- 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.
Patches and Tests
Power operator PR: https://github.com/php/php-src/pull/543
Versions
Version | Changed | Date |
---|---|---|
3 | Removed turning pow() into a language construct from the proposal, due to BC breaks. | |
2 | Closed vote and moved RFC back to Discussion status. | |
1 | Reverted commit f60b98c. |
Votes
An option needs 50%+1 votes to win
Should PHP get a power operator in 5.6? (71.9% approved) | |
---|---|
User | Vote |
aharvey | No |
ajf | Yes, right associative |
auroraeosrose | Yes, right associative |
bmajdak | No |
bwoebi | Yes, non associative |
chobieeee | Yes, right associative |
cyberspice | Yes, right associative |
datibbaw | Yes, right associative |
daverandom | Yes, right associative |
davey | Yes, right associative |
derick | Yes, right associative |
dm | Yes, right associative |
googleguy | Yes, right associative |
guilhermeblanco | No |
kassner | Yes, right associative |
krakjoe | Yes, right associative |
kriscraig | No |
levim | Yes, right associative |
lstrojny | Yes, right associative |
mbeccati | Yes, right associative |
mfonda | No |
nikic | No |
peehaa | No |
philstu | Yes, right associative |
pollita | Yes, right associative |
rasmus | Yes, right associative |
rdlowrey | Yes, right associative |
salathe | Yes, right associative |
seld | Yes, right associative |
stas | No |
uw | No |
willfitch | Yes, right associative |