2012-05-07 15 views
8

Ho appena letto la pagina sulla Expressions nella documentazione di PHP, e proprio in cima si dice:Questo trattamento speciale di exit e die è documentato in PHP?

Il modo più semplice ancora più accurato per definire un'espressione è "tutto ciò che ha un valore".

Questa semplice definizione comprende tutte le funzioni e la maggior parte dei costrutti del linguaggio, tuttavia ci alcuni costrutti del linguaggio che esplicitamente dichiarano che non restituiscono un valore.

Ecco un elenco di costrutti di linguaggio che restituisce un valore:

Ecco l'interessante pochi che non restituiscono un valore, e quindi non sono espressioni:

trovo die e exit di particolare interesse, in quanto possono essere utilizzati come espressioni in PHP pur avendo alcun valore di ritorno. Le seguenti righe di codice tutti gettano un errore di sintassi, come previsto:

echo 'Hi' or echo 'Bye'; 

if(echo('foo')) 
    return return(1); 

$foo['bar'] = isset($foo['bar']) ? unset($foo['bar']) : 0; 

if(unset($foo['bar'])) 
    __halt_compiler() or die; 

Tuttavia il seguente codice PHP è completamente privo di errori di sintassi:

print 'Hi' or print 'Bye'; // Makes sense, print returns a value 

if(!die() and exit)   // Wait what's happening here? 
    quit(die(exit(quit()))); // die and exit don't have return values (does quit?) 

$x = true ? die/2 : 5*exit(); 
$y = pow(die,7); 

isset($_GET['bar']) or die(); // This one is actually pretty commonly used. 

function quit(){    
    return exit; 
} 

Ho guardato attraverso i documenti PHP e può Trovo alcuna menzione di questo trattamento speciale di die() e exit(). Qualche esperto di PHP sa se questo è documentato ovunque. È questo comportamento previsto ed è lo schema isset($_GET['bar']) or die(); sicuro da utilizzare; potrebbe improvvisamente rompersi in una versione futura di PHP?

+8

Non è solo una questione di semantica? È che 'die()'/'exit()' non ha un valore di ritorno * perché non restituiscono mai *? Non è che sono * sintatticamente * non espressioni, ma che in fase di runtime non vedrai mai il valore di ritorno perché il tuo programma non avrà mai la possibilità di usarlo. –

+2

sicuro da usare? sì. questo idioma è disseminato in tutto il manuale negli esempi. Non potevano tirarci indietro. Inoltre, sulla lista interna, parlano sempre di quanti script in the wild verranno interrotti da una modifica prima di crearla, e questo si spezzerebbe ... immaginando 1/3 di tutti gli script php? lol – goat

risposta

3

die e exit (condividono lo T_EXIT token) rientra tra le regole per expr_without_variable durante la fase di analisi, che è il motivo per cui PHP è felice di averli in un contesto di espressione senza dare un errore di sintassi.

Qualsiasi esperto di PHP sa se questo è documentato ovunque.

Non v'è alcuna descrizione della speciale trattamento nel manuale PHP, tuttavia il first example sulla pagina manuale exit mostra in uso come … or exit.

È questo destinato comportamento, ed è il sicuro da usare isset($_GET['bar']) or die(); modello; potrebbe improvvisamente rompersi in una versione futura di PHP?

Sì. Sì. Tutto è possibile, per quanto improbabile.

+0

Risposta perfetta, grazie :) – Paulpro

+1

@salathe È possibile, ma la tua ragione è sbagliata. È possibile, perché la retrocompatibilità al 100% non è uno degli obiettivi di progettazione di PHP: http://www.php.net/manual/en/migration53.incompatible.php – Pacerier

1

un ipotesi è che die e exit fare restituire un valore, tuttavia, sarà mai essere restituito poiché l'esecuzione viene arrestata prima che venga restituito.

Questo potrebbe essere stato implementato per aggiungere un po 'di "utilità" alle funzioni die e exit.

+0

muoiono e escono terminano l'esecuzione in fase di esecuzione. L'errore di sintassi dovrebbe essere catturato al momento della compilazione. – Paulpro

+0

@ PaulP.R.O. Forse hanno pensato che sarebbe stato utile, quale è. Probabilmente restituiscono un valore, come 'print', tuttavia, il valore non viene mai restituito poiché l'esecuzione viene arrestata in anticipo. – Ben

+0

La documentazione afferma esplicitamente che non hanno un valore di ritorno: http://php.net/manual/en/function.exit.php. Sono d'accordo che è utile, ma se non è documentato da nessuna parte, sarei molto riluttante ad usare la notazione 'o die();' quando, secondo i documenti, sembra essere un errore di sintassi. – Paulpro

1

muoiono e escono il valore restituito, tuttavia tale valore deve essere utilizzato dal programma che ha chiamato lo script PHP. This comment descrive il comportamento.

4

PHP non rileva gli errori tranne in fase di esecuzione quando viene raggiunto il percorso del codice. A differenza di molti altri linguaggi, non elenca gli errori quando la pagina è "compilata" - quindi vedrai solo gli errori mentre vengono eseguite le loro rispettive linee di codice sorgente.

Nel tuo esempio, la valutazione del valore di ritorno di exit o dienon è mai fatto. PHP non segnala un errore perché non ha mai provato a valutare il risultato in primo luogo, perché il thread è terminato.

Problemi correlati