2010-08-05 15 views
14

Penso che questa possa essere una domanda stupida, ma sono abbastanza confuso se ho bisogno di scappare backslash in PHP.In PHP devo evitare i backslash?

echo 'Application\Models\User'; prints Application\Models\User 
echo 'Application\\Models\\User'; same output 
echo 'Application\Model\'User'; gives Application\Model'User 

Quindi è un carattere di escape, non dovrei bisogno di sfuggire (\) se voglio fare riferimento a Application\Models\User?

risposta

25

In single quoted strings solo le sequenze di escape \\ e \' sono riconosciuti; qualsiasi altra occorrenza di \ viene interpretata come un carattere semplice.

Quindi poiché \M e \U non sono sequenze di escape valide, vengono interpretate come sono.

+0

Ma la fuga di backslash sembra essere facoltativa, giusto? Quindi posso scrivere sia "Hello \ world" che "Hello world". La tua risposta implica che, naturalmente, '\ w' non è una sequenza di escape valida e quindi viene pubblicata come scritta. – caw

+0

@caw: No. Funziona qui, ma è _non_ perché l'escape della barra rovesciata è "opzionale", ma poiché la combinazione '\ w' non riesce a corrispondere a nulla e quindi ricade nella sua forma letterale. Ma prova a stampare un singolo '\\', ad esempio, senza fuggire. O qualsiasi cosa che finisce con una singola barra rovesciata. Avrai un errore di analisi. –

+0

@Sz Questo è solo perché la singola barra rovesciata verrà quindi interpretata come il carattere di escape per la seguente citazione singola. Hai ragione, ovviamente. L'escape del backslash è solitamente facoltativo per il motivo che hai dichiarato, vale a dire che sarà una sequenza di escape non valida nella maggior parte degli altri casi e quindi verrà stampato come una barra rovesciata letterale. – caw

0

Dal momento che il tuo ultimo esempio contiene una citazione ('), è necessario fuggire tali stringhe con addslashes funzione o la semplice aggiunta di una barra se stessi prima in questo modo:

'Application\Model\\'User' 
1

In singole stringhe tra virgolette, è facoltativa per sfuggire alla barra rovesciata, l'unica eccezione è quando è prima di una sola offerta o una barra rovesciata (perché \' e \\ sono fuga sequenze).

Questo è comune quando si scrivono le espressioni regolari, perché tendono a contenere i backslash. È più facile leggere preg_replace('/\w\b/', ' ', $str) rispetto a /\\w\\b/.

Vedere manual.

+2

I backslash devono essere preceduti da escape, come indicato nel manuale e nella risposta accettata. –

+0

@GrasDouble No, non lo fanno. Questa risposta è corretta. – caw

+2

In pratica non è necessario eseguire il escape, tranne che per un caso: se il backslash è l'ultimo carattere. ''foo \\'' funziona, ma ''foo \'' no. Penso che i backslash non sfuggiti dovrebbero essere considerati come uno zucchero sintattico. Per coerenza, puoi sempre sfuggire a loro, ma dipende da te. –

0

Penso che dipenda dal contesto, ma è una buona idea evitare i backslash se lo si utilizza nei percorsi dei file.

Un'altra buona idea è quella di assegnare il separatore di directory ad una costante, che ho visto fatto in varie applicazioni prima, e usarlo come modo:

<?php 
define('DIRECTORY_SEPARATOR', '\\'); 

echo 'Application'.DIRECTORY_SEPARATOR . 'Models' . DIRECTORY_SEPARATOR . 'User'; 
?> 

Se si desidera risparmiare spazio e digitando, altri usano DS per il nome costante.

<?php 
define('DS', '\\'); 

echo 'Application'.DS.'Models'.DS.'User'; 
?> 

questo modo il vostro portatile applicazione se si sposta da un ambiente Windows a un ambiente * nix, come è possibile semplice modifica del separatore di directory costante ad una barra.

+4

'DIRECTORY_SEPARATOR' è una costante PHP predefinita, quindi non puoi (e non vuoi) ridefinirla. –