PHP Switch语句,其中字符串封装在双引号中


PHP Switch Statement where the string is encapsulated in double quotes

我在这里有一个问题,我正在寻找有经验的程序员告诉我哪个是首选的解决方案。

返回的值用引号括起来。"TOTAL""VALUE"是两个例子。这些不应该与TOTALVALUE混淆——字符串实际上被双引号包围。

我注意到下面的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;
}