a precedencia de los operadores lógicos de @PHP afecta extrañamente los resultados de asignación de variables

$var4 = 123;

function fn1($p1)
{
    return array('p1' => 1, 'p2' => 2);
}

if ($var1 = fn1(1) AND $var4 == 123)
{
    print_r($var1);
}

if ($var2 = fn1(1) && $var4 == 123)
{
    print_r($var2);
}

if (($var3 = fn1(1)) && $var4 == 123)
{
    print_r($var3);
}
Si ejecuta este script simple, obtendrá resultados extraños, ¡al menos para mí! Primer resultado del primero si la expresión dará como resultado una matriz devuelta por la función y asignada a la variable $ var1, que es lo que espero, ¿bien?Segunda salida de la segunda si la expresión dará como resultado un entero '1' asignado a la variable $ var2, ¡lo cual NO se espera en absoluto! Tenga en cuenta que lo único cambiado es el operador lógico, he usado '&&' en lugar de 'AND', ¡eso es todo! Tercer resultado de la tercera expresión if dará como resultado nuevamente la matriz esperada devuelta de la función y asignada a la variable $ var3, exactamente como la primera expresión if, pero espera: acabo de incluir la declaración de asignación en la expresión if entre paréntesis, mientras sigo usando el segundo código de expresión if !!

¿Alguien puede explicar técnicamente -en detalle- por qué este comportamiento extraño? Los enlaces de referencia de php.net serán apreciados.

¡Sé que '&&' tiene mayor prioridad que 'AND', pero eso no me lo explica!

Respuestas a la pregunta(6)

Su respuesta a la pregunta