Table of Contents

PHP RFC: Power Operator

Introduction

This proposal is two-fold:

  1. 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.
  2. 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:

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)

Changelog

21-Dec-2013:

22-Dec-2013:

Discussion

Should -3 ** 2 evaluate to 9 instead of -9?

According to the following resources, the scale tips more towards having the exponent precede the unary minus:

Similar languages

Dissimilar languages


Should 2 ** 3 ** 2 yield 64 (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

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.

Vote

Voting will be based on the following:

Changes from 0.1:

A two third majority is required for acceptance.


Should PHP get a power operator in 5.6?
Real name Yes, right associative Yes, non associative No
aharvey (aharvey)   
ajf (ajf)   
auroraeosrose (auroraeosrose)   
bmajdak (bmajdak)   
bwoebi (bwoebi)   
chobieeee (chobieeee)   
cyberspice (cyberspice)   
datibbaw (datibbaw)   
daverandom (daverandom)   
davey (davey)   
derick (derick)   
dm (dm)   
googleguy (googleguy)   
guilhermeblanco (guilhermeblanco)   
kassner (kassner)   
krakjoe (krakjoe)   
kriscraig (kriscraig)   
levim (levim)   
lstrojny (lstrojny)   
mbeccati (mbeccati)   
mfonda (mfonda)   
nikic (nikic)   
peehaa (peehaa)   
philstu (philstu)   
pollita (pollita)   
rasmus (rasmus)   
rdlowrey (rdlowrey)   
salathe (salathe)   
seld (seld)   
stas (stas)   
uw (uw)   
willfitch (willfitch)   
Final result: 22 1 9
This poll has been closed.

Voting ends on 5th of January 2014.

Patches and Tests

Power operator PR: https://github.com/php/php-src/pull/543

PHP 5.6 Commits: 1 2