Como “fazer algo OR DIE ()” funciona em PHP?

99

Estou escrevendo um aplicativo php para acessar um banco de dados MySQL e, em um tutorial, ele diz algo na forma

mysql_connect($host, $user, $pass) or die("could not connect");

Como o PHP sabe que a função falhou para que ele execute a parte do molde? Acho que estou perguntando como a parte "ou" disso funciona. Acho que não vi isso antes.

chustar
fonte
3
Como um aparte, não use esse tipo de lógica em aplicativos reais. Ainda me surpreende quantos tutoriais fazem isso.
Eran Galperin
2
Por que não usar? É muito bom e legível ...
rkj
11
Pode ser simples e apropriado para um tutorial, mas você não quer que seu script morra desajeitadamente com uma mensagem de erro como essa na frente de usuários reais. Mostrar uma página de erro personalizada (sem especificar o erro real!) + Registrar o erro é uma obrigação.
Eran Galperin
4
Estou falando sobre o "ou", não sobre o "morrer".
Artelius
21
mysql_connect ($ host, $ user, $ pass) ou PrintNiceError ('DatabsaeConnectionError');
matpie de

Respostas:

133

Se a primeira instrução retornar true, então a instrução inteira deve ser, trueportanto, a segunda parte nunca é executada.

Por exemplo:

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

Portanto, se sua consulta não for bem-sucedida, ele avaliará a die()instrução e encerrará o script.

nickf
fonte
1
Boa explicação. Esta construção de linguagem "se implícito" do PHP é um pouco perigosa, porque você pode ter instruções que você acha que são executadas, mas na verdade não são, e isso não é tão óbvio como se você tivesse um bloco if.
Petruza
6
Isso é chamado de avaliação de curto-circuito e também é útil em outras linguagens além do PHP.
Sr. Griever
1
A propósito, você só pode usar uma única instrução após OR. Uma instrução de bloco falhará na verificação de sintaxe (por exemplo, a mensagem de erro real pode ser Erro de análise: erro de sintaxe, inesperado '{' em ...)
Scott Chu
E aqui estava eu, pensando que isso era algum tipo de recurso avançado como a withdeclaração de python , quando na verdade é apenas uma expressão booleana ... Acho que um cuidado extra deve ser tomado ao usar essa expressão se for esperado que você execute uma limpeza no caso de erros. Por favor, corrija-me se eu estiver errado, mas se você corrigir func_call($file) or die();e a função falhar, o arquivo será deixado aberto quando o script morrer.
pedromanoel
@Petruza É mesmo uma boa prática usar orem situações onde um ifpoderia trabalhar?
limão
32

O PHP orfunciona como o C ||(que, aliás, também é suportado pelo PHP - oré mais bonito e tem precedência de operador diferente - veja esta página ).

É conhecido como operador de curto-circuito porque irá ignorar qualquer avaliação assim que tiver informações suficientes para decidir o valor final.

Em seu exemplo, se mysql_connect()retornar TRUE, então o PHP já sabe que toda a instrução será avaliada como TRUE, não importa o die()que die()seja avaliado e, portanto, não é avaliada.

Se mysql_connect()retornar FALSE, o PHP não sabe se a instrução inteira será avaliada como TRUE ou FALSE, então continua e tenta avaliar die()- terminando o script no processo.

É apenas um truque legal que aproveita a maneira como orfunciona.

Artelius
fonte
1 para nomear curto-circuito. Também pode ter chamado de "efeito colateral". Não estamos interessados ​​no código de retorno die (), apenas queremos o efeito de sua execução. (Nem sempre vai ser morrer ()). Isso nem sempre é popular entre os puristas, pois alguns efeitos podem ser obscuros.
mckenzm
e isso não é tudo. você também pode usar e combinar coisas, onde quiser que uma coisa funcione definitivamente antes de fazer outra coisa.
My1 de
11

Funciona como outros descreveram.

No PHP, não use "die", já que NÃO levanta uma exceção (como faz em Perl). Em vez disso, lance uma exceção corretamente da maneira normal.

O dado não pode ser capturado em PHP e não registra - em vez disso, ele imprime a mensagem sem graça e fecha imediatamente o script sem dizer nada a ninguém ou dar a você qualquer oportunidade de registrar o evento, tentar novamente, etc.

MarkR
fonte
-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
Arun Kumar
fonte