【问题标题】:What is the difference between Switch-Case and If-Else in PHP?PHP中的Switch-Case和If-Else有什么区别?
【发布时间】:2011-11-09 14:12:22
【问题描述】:

我正在决定是否在我正在编写的 PHP 站点中使用 if/elseswitch/case,我想知道使用其中一个或另一个是否有任何好处在某些情况下,打算使用一个而不是另一个。

【问题讨论】:

    标签: php


    【解决方案1】:

    有趣的问题,因为在编译语言(甚至是 JIT 语言)中,使用 switch 语句可以获得很好的性能提升,因为编译器可以构建跳转表并将在恒定时间内运行。甚至打开字符串也可以优化,因为可以对字符串进行哈希处理。但是,根据我的阅读,似乎 php 没有进行这样的优化(我假设是因为它是逐行解释和运行的)。

    关于开关优化的精彩 .Net 文章:If vs. Switch Speed

    关于 php 被解释,PHP 文档说:http://php.net/manual/en/control-structures.switch.php

    了解switch语句是如何执行的很重要 为了避免错误。 switch语句逐行执行 (实际上,逐个声明)。一开始,没有代码 执行。仅当找到具有以下值的 case 语句时 匹配 switch 表达式的值 PHP 是否开始执行 声明。 PHP 继续执行语句直到结束 的 switch 块,或者它第一次看到一个 break 语句。如果 你不会在 case 语句的末尾写一个 break 语句 列表,PHP 将继续执行以下 case 的语句。

    我还发现一些参考资料都表明 php 中的 if / else 语句实际上可能比 switch 语句更快(奇怪)。如果您编译 php,这可能不是真的(我从未做过,但显然这是可能的)。

    http://www.fluffycat.com/PHP-Design-Patterns/PHP-Performance-Tuning-if-VS-switch/

    尤其是这篇文章,http://php100.wordpress.com/2009/06/26/php-performance-google/,很有趣,因为作者比较了 if 和 switch 的内部 php 代码,它们几乎相同。

    无论如何,我会说任何性能提升都将是微不足道的,因此它更多的是用户偏好。 if 语句更灵活,您可以更轻松地捕获值范围(尤其是大范围)以及进行更复杂的比较,而 switch 语句恰好排列一个值。

    【讨论】:

    • 哇,太棒了。非常全面。真的很感激。我一直在使用 if-else,但我开始想把它弄混一下 :)
    • @Sam,HHVM 怎么样?文档明确指出引擎必须逐行(逐句声明)执行此操作似乎很奇怪。那么一个不逐行优化的引擎就不再合规了?
    • @Pacerier 我不会说合规意味着必须逐行进行切换。我不清楚 HHVM 是否使用跳转表。我认为在文档中,它显示了“if”语句的示例,然后是“switch”等价的逻辑,但不一定是实现或性能。 HHVM 可以很好地优化 switch 语句以使用跳转表,因为它在执行之前将源代码编译为字节码。
    • @Sam,但它必须遵循 php.net/ 上定义的标准...如果他们这样做,他们将违反 php.net/manual/en/control-structures.switch.php "switch 语句按行执行行(实际上是逐语句)。开始时没有执行任何代码。只有...."
    【解决方案2】:

    switch-case 语句只切换给定表达式的值。如果您有很多(我会说甚至不止两个)可能的操作来决定,这会非常方便。所以,如果你有一个变量的多个离散值,并且为每个值执行一些代码,那么 switch-case 语句可能会更好。

    另一方面,如果您有一个比简单相等更复杂的测试,或者如果只涉及两种可能性,那么 if-else 可能会更好。

    请注意,就实际行为而言,它们是相同的;这只是一个问题,对于您、程序员以及其他需要阅读或修改代码的人来说,哪个更方便。

    【讨论】:

    • 非常感谢。很有帮助。
    【解决方案3】:

    if-else 语句可以评估几乎所有类型的数据,例如整数、浮点、字符、指针或布尔值。 switch 语句可以计算整数或字符。在 'if-else' 语句的情况下,将根据条件执行 'if' 块或 'else' 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-11
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-28
      • 1970-01-01
      相关资源
      最近更新 更多