Ecco un punto fondamentale della lezione. Queste cose vanno conosciute a memoria se si intende fare qualcosa seriemente altrimenti non si andrà facilmente oltre al 2 + 2.
Prima di tutto chiariamo cosa sono l’associatività e la precedenza.

Associatività e la precedenza di ogni operatore sono definite nel PHP esattamente come in algebra e ci permettono di scrivere espressioni complesse molto facilmente. L’interprete divide infatti tutti gli operatori che abbiamo visto in vari gruppi con priorità diversa.

Ad esempio il gruppo di precedenza A avrà priorità maggiore del gruppo B quindi quando verrà effettuata la valutazione dell’espressione per trovarne il risultato tutti gli operatori del gruppo A saranno applicati per primi.

Tramite l’associatività dei vari operatori l’interprete sa invece come comportarsi quando incontra due operatori che appartengono allo stesso gruppo di precedenza.

Qui di seguito riporto una piccola tabella con tutti gli operatori visti in lezione con la rispettiva associatività e gruppi di precedenza. Tutti gli operatori sono in ordine crescente quindi i primi sono quelli con precedenza piú bassa.

Associatività Operatori
Sinistra ,
Sinistra or
Sinistra xor
Sinistra and
Destra print
Sinistra = += -= *= /= .= %= &= |= ^= ~= <<= >>=
Sinistra ? :
Sinistra ||
Sinistra &&
Sinistra |
Sinistra ^
Sinistra &
Non associativi == != === !==
Non associativi < <= > >=
Sinistra << >>
Sinistra + – .
Sinistra * / %
Destra ! ~ ++ — (int) (float) (string) (array) (object) @
Destra [
Non associativi new

Quando si vuole per qualche motivo forzare l’interprete a valutare un espressione prima delle altre basta racchiuderla tra parentesi tonde proprio come in matematica.

Le prime volte è utile anche costruirsi l’AST (abstract syntax tree) e fare una navigazione post-order dell’espressione per prendere familiarità con operatori, associatività e precedenza.

<?php
 
/* esempio di espressioni */
$a = 5 && 10;
$a = 5 and 10; /* questa espressione non ha lo stesso effetto
                  della precedente l'operatore and ha una
                  precedenza minore di quello di assegnazione
               */
 
$a = (5 and 10); // questa è corretta
 
$x = 10 + 4 * 2; /* il risultato è 18 e non 28.
                    l'operatore di moltiplicazione ha priorità
                    maggiore
                 */
 
$k = ~$x++;   /* l'operatore "~" e "++" hanno la stessa
                 precedenza. Hanno associatività a destra
                 quindi il "++" viene applicato per prima
              */
 
$z = 4 + (4 * 2);
 
?>

AST e post-order dell’espressione precedente:

	+------------+
	|  <op-exp>  |
	+------------+
	7   / | \
	   /  |  \
	  /   |   \
      +---+ +---+ +-------------+
      | 4 | | + | |  <op-exp>   |
      +---+ +---+ +-------------+
      1     2    6    / | \
                     /  |  \
                    /   |   \
		+---+ +---+ +---+
		| 4 | | * | | 2 |
		+---+ +---+ +---+
		  3    4     5

vicius