Företrädet för en operator specificerar hur "tätt" den binder samman två uttryck. Till exempel, i uttrycket 1 + 5 * 3, är svaret 16 och inte 18 eftersom multiplikationsoperatorn ("*") har högre företräde än additionsoperatorn ("+"). Parenteser kan användas för att tvinga fram företräde vid behov. Till exempel: (1 + 5) * 3 utvärderas till 18.
När operatorer har lika företräde avgör deras associativitet hur operatorerna grupperas. Till exempel är "-" vänsterassociativ, så 1 - 2 - 3 grupperas som (1 - 2) - 3 och utvärderas till -4. "=" å andra sidan är högerassociativ, så $a = $b = $c grupperas som $a = ($b = $c).
Operatorer med lika företräde som är icke-associativa kan inte användas bredvid varandra, till exempel är 1 < 2 > 1 olagligt i PHP. Uttrycket 1 <= 1 == 1 är däremot lagligt, eftersom ==-operatorn har lägre företräde än <=-operatorn.
Associativitet är endast meningsfull för binära (och ternära) operatorer. Unära operatorer är antingen prefix eller postfix så denna notion är inte tillämplig. Till exempel kan !!$a endast grupperas som !(!$a).
Användning av parenteser, även när det inte strikt är nödvändigt, kan ofta öka läsbarheten i koden genom att göra grupperingen explicit istället för att förlita sig på den implicita operatorföreträdet och associativiteten.
Följande tabell listar operatorerna i ordning av företräde, med de med högst företräde överst. Operatorer på samma rad har lika företräde, i vilket fall associativiteten avgör grupperingen.
Operatorföreträde och associativitet bestämmer endast hur uttryck grupperas, de specificerar inte en utvärderingsordning. PHP specificerar inte (i allmänhet) i vilken ordning ett uttryck utvärderas och kod som antar en specifik utvärderingsordning bör undvikas, eftersom beteendet kan ändras mellan versioner av PHP eller beroende på omgivande kod. Exempel #2 Odefinierad utvärderingsordning <?php $a = 1; echo $a + $a++; // kan skriva ut antingen 2 eller 3 $i = 1; $array[$i] = $i++; // kan sätta antingen index 1 eller 2 ?> Exempel #3 +, - och . har samma företräde (före PHP 8.0.0) <?php $x = 4; // denna rad kan resultera i oväntad utskrift: echo "x minus one equals " . $x-1 . ", eller så hoppas jag\n"; // eftersom det utvärderas som denna rad (före PHP 8.0.0): echo (("x minus one equals " . $x) - 1) . ", eller så hoppas jag\n"; // den önskade företrädet kan upprätthållas genom att använda parenteser: echo "x minus one equals " . ($x-1) . ", eller så hoppas jag\n"; ?> Ovanstående exempel kommer att skriva ut: -1, eller så hoppas jag -1, eller så hoppas jag x minus one equals 3, eller så hoppas jag Notering: Även om = har lägre företräde än de flesta andra operatorer, tillåter PHP fortfarande uttryck som liknar följande: if (!$a = foo()), i vilket fall foo():s returvärde sätts i $a.
Ändringslogg
Version
Beskrivning
8.0.0
Strängkonkatenering (.) har nu lägre företräde än aritmetisk addition/subtraktion (+ och -) och bitvis skift vänster/höger (<< och >>); tidigare hade den samma företräde som + och - och ett högre företräde än << och >>.
8.0.0
Den ternära operatorn (? :) är nu icke-associativ; tidigare var den vänsterassociativ.
7.4.0
Att förlita sig på företrädet för strängkonkatenering (.) i förhållande till aritmetisk addition/subtraktion (+ eller -) eller bitvis skift vänster/höger (<< eller >>), dvs. använda dem tillsammans i ett oparanteserat uttryck, är föråldrat.
7.4.0
Att förlita sig på vänsterassociativitet av den ternära operatorn (? :), dvs. nysta flera oparanteserade ternära operatorer, är föråldrat.