2009-07-22 17 views
9

Qualcuno sa perché my require_once() o die(); non funziona. Viene sempre visualizzato l'errore Fatal invece del messaggio di errore che inserisco nel die(). Vedi sotto per il mio codice: visualizzazione dei messaggirequire_once() o die() non funziona

require_once ('abc.php') or die("oops"); 

errore, come di seguito

"Fatal error: controller::require_once() [function.require]: Failed opening required '1' (include_path='....."

invece del messaggio ("oops") chiave io in

risposta

28

o ha un più alto. precedenza che richiedono/require_once. Pertanto php valuta

('abc.php') or die("oops") 

prima di passare il risultato a require_once. Oppure prende due operandi booleani. ('Abc.php') valuta per vero quindi l'intera espressione è vero e

require_once true; 

viene richiamato. require_once accetta una stringa, bool (true) - > string = > 1 = >

Failed opening required ' 1'
Non hai bisogno di o muori (...) lì. Se il file non può essere letto require_once fermerà comunque l'istanza di php.

+4

risposta brillante. È necessario sottolineare che require_once non è una funzione. È un operatore unario (o un costrutto linguistico, se preferisci), quindi è eco, nuovo, include, ecc. –

+0

grazie! kinda fa schifo però aggiungendo il 'die()' in un modo apparentemente accettabile, genera un errore che SEMBRA come un errore nel trovare il file e/o richiederlo -oppure- un errore nel file incluso ... quando davvero è male il codice di 'require() o die()' – aequalsb

12

Come include è una speciale costrutto del linguaggio e non una funzione, non ha bisogno paranthesis per la lista paremeter:

Because include() is a special language construct, parentheses are not needed around its argument. Take care when comparing return value.

Infatti ha un solo parametro e avvolgendolo in parentesi supplementare non lo fa cambia nulla:

1 ≡ (1) ≡ ((1)) ≡ (((1))) ≡ …

Quindi la tua affermazione è identico a questo (il paremter è appena concluso):

require_once (('abc.php') or die("oops")); 

Quindi abbiamo un'espressione booleana come parametro che è true o false. E che i valori hanno l'equivalente di stringa di "1" e "" rispettivamente:

var_dump((string) true === "1"); 
var_dump((string) false === ""); 

Questo è il motivo per cui ottenere questo apertura Impossibile richiesto '1' messaggio di errore.

Ma usando parentesi sul giusto posto come questo lo fa funzionare come si desidera:

(@include_once 'abc.php') or die("oops"); 

Qui 'abc.php' è chiaramente il parametro e la disgiunzione con die("oops") viene eseguita sul valore di ritorno di include_once. Il @ operator è solo per ignorare il messaggio di errore includ_once verrà generato se il file non esiste.

PS: print è anche un costrutto linguaggio speciale e funziona allo stesso modo.

4

Nel valutare:

require_once ('abc.php') or die("oops"); 

PHP valuta 'OR die ("oops")' prima per qualche ragione. per forzare PHP a valutare il valore "require_once ('abc.php')" lo racchiudiamo tra parentesi.

(require_once ('abc.php')) OR die("oops"); 

Tuttavia, se "richiedere" fallisce, PHP interrompe l'elaborazione in modo da utilizzare "include", invece (vedi https://stackoverflow.com/a/2418514/1704651). Inoltre, il simbolo @ prima di include_once sopprime il messaggio di errore da MySQL, quindi viene visualizzato solo "oops".

(@include_once ('abc.php')) OR die("oops"); 

Funziona come previsto.

Fonte: La mia frustrazione e https://bugs.php.net/bug.php?id=22342

+0

include o die è quello che ho usato anche. È utile quando è necessario chiarire il motivo per cui manca un file (ad esempio un file di configurazione che era necessario definire) – jocull

+0

Mettere @ before include è probabilmente una cattiva idea. @include causa la soppressione di TUTTI gli errori nel file incluso e di tutti i file inclusi da quel file, il che rende la risoluzione dei problemi e la gestione degli errori un incubo. –

Problemi correlati