2010-08-05 64 views
14

我认为这可能是一个愚蠢的问题,但我很困惑我是否需要在PHP中转义反斜杠。在PHP中我需要逃避反斜杠?

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

所以这是一个转义字符,我不应该需要逃避它(\)如果我想指的Application\Models\User

回答

25

single quoted strings只有转义序列\\\'被认可;任何其他出现的\被解释为普通字符。

如此以来\M\U没有有效的转义序列,它们被解释为它们。

+0

但逃避反斜杠本身似乎是可选的,对不对?所以我可以写'Hello \ world''和'Hello \\ world''。当然,您的答案意味着'\ w'不是有效的转义序列,因此输出为书写。 – caw 2016-12-03 03:54:39

+0

@caw:不,它不会在这里工作,但是这是因为_不_逃避反斜杠是“可选”,而是因为在'\ w'组合无法匹配任何东西,而返回到它的字面形式。但是,尝试打印一个'\\',例如,不要逃避。或者任何以单个反斜杠结尾的内容。你会得到一个解析错误。 – 2018-01-24 19:24:29

+0

@Sz这只是因为单个反斜杠将被解释为以下单引号的转义字符。当然你是对的。出于您陈述的原因,反斜杠的转义通常是可选的,即在大多数其他情况下它将是无效的转义序列,因此将其打印为文字反斜杠。 – caw 2018-01-24 21:25:28

0

由于您的最后一个例子包含引号('),你需要逃脱这样的字符串与addslashes功能还是简单地增加前一个斜线自己是这样的:

'Application\Model\\'User' 
1

在单引号中的字符串,它是可选的转义反斜线,唯一的例外是当一个单引号或反斜杠之前的(因为\'\\是逃生序列)。

这编写正则表达式的时候,因为他们往往包含反斜杠是常见的。阅读preg_replace('/\w\b/', ' ', $str)/\\w\\b/更容易阅读。

manual

+2

正如手册和接受的答案中所述,反斜杠必须避免。 – 2013-06-22 00:22:27

+0

@GrasDouble不,他们不。这个答案是正确的。 – caw 2016-12-03 03:56:07

+2

实际上,除了一种情况外,它们不必转义:如果反斜杠是最后一个字符。 ''foo \\''起作用,但'foo \'不起作用。我认为非逃避的反斜杠应该被认为是一个句法糖。为了保持一致性,你可能总想逃避它们,但这取决于你。 – 2016-12-03 05:14:52

0

我认为这取决于上下文,但如果文件路径中使用它来逃避反斜杠一个好主意。

另一个好主意是目录分隔分配给一个恒定的,这是我见过之前在各种应用中进行,并且因此使用它:如果你想节省空间和打字

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

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

,其他人使用DS作为常数名称。

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

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

这样可以使你的应用程序移植,如果你在Windows环境移动到* nix的环境,因为你可以简单的改变目录分隔恒正斜杠。

+4

'DIRECTORY_SEPARATOR'是一个预定义的PHP常量,所以你不能(也不想)重新定义它。 – 2013-06-22 00:17:54