2011-12-22 54 views
0

我在这里有一个问题,我正在寻找有经验的程序员告诉我哪个是首选解决方案。PHP Switch Statement其中字符串被封装在双引号

我有报价被包围的值被返回。两个例子是"TOTAL""VALUE"。这些不应与TOTALVALUE相混淆 - 字符串实际上被双引号包围。

我注意到的是,switch语句下面不起作用,因为它是寻找TOTAL"TOTAL"

switch ($statTypeName) { 
    case "TOTAL": 
     echo "<br>TOTAL"; 
     break; 
    case "VALUE": 
     echo "<br>VALUE"; 
     break; 
} 

得到这个工作,我不得不把一个单引号周围的情况下 - '"TOTAL"' 。 在我的文本编辑器(Notepad ++)中,很难看到围绕双引号的单引号。

我知道这不是一个常见问题,但是解决这个问题的“专业”方式是什么?我做到了这一点,或者我应该从引用的字符串中提取字符串,并彻底废除双引号..?

谢谢!

回答

1

您碰到的情况确实很常见,您可以通过几种不同的方式了解它。你做这件事的方式没有问题,或@KyleBanks解决方案(转义双引号)。鉴于PHP提供单引号和双引号字符串定义,我更喜欢第一个。但它取决于你的偏好,或你的开发团队。

至于提取字符串中的子字符串引号..这取决于他们在那里的第一个地方。

+0

我正在解析一个文件,所以原作者打算将该值包含在引号内。我无法控制这一点,只有我解析的方式:)。我将在双引号字符串周围使用单引号。谢谢! – pr0tocol 2011-12-22 23:33:51

+0

如果你不需要引用你的程序的目的,你可以解析他们,避免使用你的代码中的引号,是吗? – 2011-12-22 23:43:10

2
case "\"TOTAL\"": 

转义内部双引号。它会以相同的方式工作,并且可能会对读者更清晰可见

1

我会建议在Notepad ++中使用更好的字体。我个人使用索拉但是在这里你可以找到其他好的选择堆: Recommended Fonts for Programming?

其他然后改变字体逃逸引号的建议是另一种选择:

case "\"TOTAL\"": 

您也可以尝试剥离报价:

switch (substr($statTypeName, 1, -1)) {...} 

但我认为这是一个更危险的方法,除非你开始使用更复杂的代码去除它们与检查和一切,在这种情况下,它显然变成了一个矫枉过正。

+1

switch(trim($ statTypeName,''')){...}更清洁,而且危险性更低 – 2011-12-23 00:13:43

+0

这是一个很好的评论,我不知道trim的第二个参数 – 2011-12-23 01:43:56

0

除非您的给定代码不是某种StatType类的一部分,并且在内部处理stat类型状态的表示,我的答案可能会略微缺少这一点,但在任何情况下都是如此。

事实上,你在这里做错了什么,你问的是寻找一种方法来解决你所遇到的基本问题。相反,你应该修复基本问题。

重要的问题是你缺少一个抽象层,它将坐在代表你的statType的方式和你使用它的方式之间。

所以,你的程序不应该关心如果你打电话给StatType标识:

“总”或“‘总’”或“总”或“总”

你需要什么关心的是你的statType在程序执行的某一时刻处于某种状态。如何实现状态的表示(带引号或数字的字符串)是实现的细节,您的switch语句不应该关心它。

如果您决定将statTypeName更改为不带引号,会发生什么情况。比起你必须去看所有依赖引号并改变它的代码行。如果以某种方式隐藏实现细节,则不需要更改多行代码。

也许一种方法来设置statTypes抽象? (为了清晰起见,简化了)

class StatType 
{ 
    const TOTAL = 0; 
    const VALUE = 1; 
    // etc. 
} 

switch ($statType->type()) { 
    case StatType::TOTAL: 
     echo "<br>TOTAL"; 
     break; 
    case StatType::VALUE: 
     echo "<br>VALUE"; 
     break; 
}