This proposal is two-fold:
**
.**=
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:
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)
21-Dec-2013:
22-Dec-2013:
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
Dissimilar languages
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
Languages with right associative exponential operator
Languages with non associative exponential operator
Sources
PHP 5.6
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.
Voting will be based on the following:
**
and **=
,ZEND_POW
and ZEND_ASSIGN_POW
opcodes.Changes from 0.1:
**
operator. See also: Discussion. This counts as an inclusion vote.A two third majority is required for acceptance.
Voting ends on 5th of January 2014.
Power operator PR: https://github.com/php/php-src/pull/543