precedência dos Operadores Lógicos do @PHP afeta os resultados das atribuições variáveis estranhamente

$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);
}
Se você executar esse script simples, ele produzirá resultados estranhos, pelo menos para mim! Primeira saída da primeira, se a expressão resultar em uma matriz retornada da função e atribuída à variável $ var1, que é o que eu estou esperando, beSegunda saída do segundo se a expressão resultar em um número inteiro '1' atribuído à variável $ var2, o que NÃO é esperado !! Observe que a única coisa alterada é o operador lógico, usei '&&' em vez de 'AND', só isso !! Terceira saída da terceira se expressão resultará novamente a matriz esperada retornada da função e atribuída à variável $ var3, exatamente como a primeira expressão se, mas espere: acabei de abraçar a instrução de atribuição na expressão if entre colchetes, enquanto ainda estiver usando o segundo código de expressão if

Alguém pode explicar tecnicamente - em detalhes - por que esse comportamento estranho? Os links de referência do php.net serão apreciado

Sei que '&&' tem maior precedência que 'AND', mas isso não me explica !!

questionAnswers(6)

yourAnswerToTheQuestion