Come funziona "fare qualcosa OR DIE ()" in PHP?


99

Sto scrivendo un'app php per accedere a un database MySQL e in un tutorial dice qualcosa del modulo

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

Come fa PHP a sapere che la funzione non è riuscita in modo da eseguire la parte dello stampo? Immagino di chiedermi come funziona la parte "o". Non credo di averlo visto prima.


3
Per inciso, non utilizzare questo tipo di logica nelle applicazioni reali. Mi stupisce ancora quanti tutorial lo facciano.
Eran Galperin,

2
Perché non usarlo? È davvero carino e leggibile ...
rkj

11
Potrebbe essere semplice e appropriato per un tutorial, ma non vuoi che il tuo script muoia in modo sgraziato con un messaggio di errore come quello di fronte a utenti reali. Mostrare una pagina di errore personalizzata (senza specificare l'errore effettivo!) + Registrare l'errore è un must.
Eran Galperin,

4
Sto parlando della "o", non del "dado".
Artelius

21
mysql_connect ($ host, $ user, $ pass) o PrintNiceError ('DatabsaeConnectionError');
matpie

Risposte:


133

Se la prima istruzione ritorna true, allora l'intera istruzione deve essere truequindi la seconda parte non viene mai eseguita.

Per esempio:

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

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

Pertanto, se la query non ha esito positivo, valuterà l' die()istruzione e terminerà lo script.


1
Buona spiegazione. Questo costrutto del linguaggio "se implicito" di PHP è un po 'pericoloso, perché puoi avere istruzioni che pensi vengano eseguite ma in realtà non lo fanno, e non è così ovvio come se avessi un blocco if.
Petruza

6
Questa è chiamata valutazione di cortocircuito ed è utile anche in linguaggi diversi da PHP.
Mr Griever

1
A proposito, puoi usare solo una singola istruzione dopo OR. Un'istruzione di blocco fallirà il controllo della sintassi (ad esempio, il messaggio di errore effettivo potrebbe essere Parse error: syntax error, imprevisto "{" in ...)
Scott Chu

Ed eccomi qui, pensando che questa fosse una sorta di funzionalità avanzata come l' withaffermazione di python , quando in realtà è solo un'espressione booleana ... Penso che si dovrebbe prestare particolare attenzione quando si usa questa espressione se ci si aspetta che esegua una pulizia in caso di errori. Per favore, correggimi se sbaglio, ma se lo fai func_call($file) or die();e la funzione fallisce, il file viene lasciato aperto quando lo script muore.
pedromanoel

@Petruza È anche una buona pratica da usare orin situazioni in cui ifpotrebbe funzionare?
limone

32

PHP orfunziona come C ||(che per inciso è supportato anche da PHP - orsembra semplicemente più bello e ha una diversa precedenza per gli operatori - vedi questa pagina ).

È noto come operatore di cortocircuito perché salterà qualsiasi valutazione una volta che avrà informazioni sufficienti per decidere il valore finale.

Nel tuo esempio, se mysql_connect()restituisce TRUE, allora PHP sa già che l'intera istruzione restituirà TRUE indipendentemente da ciò che viene die()valutato, e quindi die()non viene valutato.

Se mysql_connect()restituisce FALSE, PHP non sa se l'intera istruzione restituirà TRUE o FALSE, quindi prosegue e cerca di valutare die(), terminando lo script nel processo.

È solo un bel trucco che sfrutta il modo in cui orfunziona.


+1 per la denominazione di cortocircuito. Potrebbe anche aver chiamato "effetto collaterale". Non siamo affatto interessati al codice di ritorno die (), vogliamo solo l'effetto della sua esecuzione. (Non morirà sempre ()). Questo non è sempre popolare tra i puristi poiché alcuni effetti possono essere oscuri.
mckenzm

e questo non è tutto. puoi anche usare e per combinare cose, dove vuoi che una cosa funzioni sicuramente prima di fare una seconda cosa.
mio 1

11

Funziona come altri hanno descritto.

In PHP, non usare "die", poiché NON solleva un'eccezione (come fa in Perl). Invece lancia un'eccezione correttamente nel modo normale.

die non può essere catturato in PHP e non esegue il log - invece stampa il messaggio in modo sgraziato e chiude immediatamente lo script senza dire nulla a nessuno o darti l'opportunità di registrare l'evento, riprovare ecc.


-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.