我在这里有一个问题,我正在寻找有经验的程序员告诉我哪个是首选的解决方案。
返回的值用引号括起来。"TOTAL"
和"VALUE"
是两个例子。这些不应该与TOTAL
和VALUE
混淆——字符串实际上被双引号包围。
我注意到下面的switch语句不起作用,因为它正在寻找TOTAL
而不是"TOTAL"
:
switch ($statTypeName) {
case "TOTAL":
echo "<br>TOTAL";
break;
case "VALUE":
echo "<br>VALUE";
break;
}
为了使其工作,我必须在case ('"TOTAL"'
)周围加上一个单引号。在我的文本编辑器(notepad++)中,很难看到双引号周围的单引号。
我知道这不是一个常见的问题,但是解决这个问题的"专业"方法是什么?我这样做,或者我应该从引号字符串中提取字符串,并完全取消双引号…?
谢谢!
case "'"TOTAL'"":
转义内部双引号。它将以相同的方式工作,并且可能对读者来说更明显一些
您遇到的情况确实很常见,您可以采用几种不同的方法。你这样做的方式没有错,或者@KyleBanks解决方案(转义双引号)。鉴于php提供单引号和双引号字符串定义,我更喜欢前者。但这取决于你的喜好,或者你的开发团队。
至于在字符串引号中提取子字符串…
我建议在notepad++中使用更好的字体。我个人使用Consolas,但在这里你可以找到许多其他的好选择:推荐的编程字体?
根据建议更改字体转义引号是另一种选择:
case "'"TOTAL'"":
你也可以试着去掉引号:
switch (substr($statTypeName, 1, -1)) {...}
,但我认为这是一种更危险的方法,除非你开始使用更复杂的代码来剥离它们,在这种情况下,它显然是多余的
除非你给定的代码不是某种StatType类的一部分,并且在内部处理StatType状态的表示,我的答案可能有点错过了这一点,但无论如何,这里是
事实上,你在这里做错了,你所要求的是找到一种方法来解决你所遇到的根本问题。相反,你应该解决根本问题。
根本的问题是你缺少了一个抽象层,它将位于你表示statType的方式和你使用它的方式之间。
所以,你的程序不应该关心你是否调用了statType:"TOTAL"或"TOTAL"或"TOTAL"或"TOTAL"
您需要关心的是,您的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;
}