2010-08-05 18 views
14

Creo que esta puede ser una pregunta estúpida, pero estoy bastante confundido sobre si necesito escapar de la barra invertida en PHP.En PHP, ¿necesito escapar de las barras diagonales inversas?

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

Así que es un carácter de escape, no debería necesitar para escapar de ella (\) si quiero hacer referencia a Application\Models\User?

Respuesta

25

En single quoted strings sólo las secuencias de escape \\ y \' son reconocidos; cualquier otra aparición de \ se interpreta como un carácter simple.

Por lo tanto, dado que \M y \U no son secuencias de escape válidas, se interpretan como son.

+0

Pero escapar de la barra invertida en sí parece ser opcional, ¿no? Así que puedo escribir tanto ''Hello \ world'' como'' Hello \\ world''. Su respuesta implica eso, por supuesto, porque '\ w' no es una secuencia de escape válida y, por lo tanto, da como resultado lo escrito. – caw

+0

@caw: No. Funciona aquí, pero eso no es porque escaparse de la barra diagonal inversa es "opcional", sino porque la combinación '\ w' no puede coincidir con nada, y por lo tanto vuelve a su forma literal. Pero intente imprimir un solo '\\', por ejemplo, sin escaparse. O cualquier cosa que termine con una sola barra invertida. Obtendrás un error de análisis. –

+0

@Sz Eso es simplemente porque la barra invertida única se interpretará como el carácter de escape para la siguiente comilla simple. Estas en lo correcto, por su puesto. El escape de la barra diagonal inversa suele ser opcional por el motivo que usted indicó, a saber, que será una secuencia de escape no válida en la mayoría de los casos y, por lo tanto, se imprimirá como una barra diagonal inversa literal. – caw

0

Desde el último ejemplo contiene una cita ('), tiene que escapar esas cadenas con addslashes función o simplemente añadiendo una barra a sí mismo antes de que de esta manera:

'Application\Model\\'User' 
1

cadenas entre comillas sencillas, es opcional para escapar de la barra invertida, la única excepción es cuando está ante una comilla simple o una barra invertida (porque \' y \\ son de escape secuencias).

Esto es común al escribir expresiones regulares, porque tienden a contener barras diagonales inversas. Es más fácil leer preg_replace('/\w\b/', ' ', $str) que /\\w\\b/.

Ver el manual.

+2

Las barras diagonales inversas deben evitarse, como se indica en el manual y en la respuesta aceptada. –

+0

@GrasDouble No, no es así. Esta respuesta es correcta. – caw

+2

En la práctica no tienen que escaparse, excepto en un caso: si la barra invertida es el último carácter. ''foo \\' 'funciona, pero'' foo \ ''no. Creo que las barras invertidas no escapadas deben considerarse como un azúcar sintáctico. Para mantener la coherencia, es posible que siempre desee escapar de ellos, pero depende de usted. –

0

Creo que depende del contexto, pero es una buena idea escapar de las barras diagonales inversas si se usa en rutas de archivos.

Otra buena idea es asignar el separador de directorio a una constante, lo que he visto hecho en varias aplicaciones antes, y utilizarlo como así:

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

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

Si desea ahorrar espacio y escribir, otros usan DS para el nombre constante.

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

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

Esto mantiene su portátil de la aplicación si se pasa de un entorno Windows a un entorno * nix, como pueda simple cambio de la constante a una barra inclinada separador de directorio.

+4

'DIRECTORY_SEPARATOR' es una constante de PHP predefinida, por lo que no puede (y no quiere) redefinirla. –

Cuestiones relacionadas