PHP中的Switch-Case和If-Else有什么区别?


What is the difference between Switch-Case and If-Else in PHP?

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


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

关于交换机优化的伟大.NET文章:if与switch speed

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

It is important to understand how the switch statement is executed in
order to avoid mistakes. The switch statement executes line by line
(actually, statement by statement). In the beginning, no code is
executed. Only when a case statement is found with a value that
matches the value of the switch expression does PHP begin to execute
the statements. PHP continues to execute the statements until the end
of the switch block, or the first time it sees a break statement. If
you don't write a break statement at the end of a case's statement
list, PHP will go on executing the statements of the following 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-vs开关的内部php代码,它们几乎是相同的。

不管怎样,我会说任何性能提升都是微不足道的,所以它更多的是用户偏好。如果语句更灵活,您可以更容易地捕获值的范围(尤其是较大的范围),并进行更复杂的比较,而switch语句只排列一个值。


switch case语句只打开给定表达式的值。如果你有很多(我甚至会说超过两个)可能的行动来决定两者,这会非常方便。因此,如果一个变量有许多离散值,并且要为这些值中的每一个执行一些代码,那么switch case语句可能更好。

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

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