注意:我知道这是不可接受的代码,我正在寻求理解解释器在做什么,而不是关于如何获得相同结果的建议!
从那以后,我已经阅读了足够多的内容,意识到我不能也不应该尝试使用 |,|| 或 XOR 来定义一个 switch 案例——所以请不要评论“不要那样做”的效果,我只是想了解解释器对这些语句做了什么并理解行为的奇怪之处。我正在使用 PHP 5.3.1。
这是我真正打算做的,现在正在使用,请不要推荐代码:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : -5; //angle from goal
break;
case 1:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
case 2:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -10; //miss penalty
break;
case 3:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : -10; //error penalty
break;
}
}
但是很好奇我是否可以这样做:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0 || 1:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : 15; //angle from goal
break;
case 2 || 3:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
}
}
而且,反常地,这确实运行了,但是非常慢(比如,几秒钟),尽管它当然(0||1)
不会按照我想要的方式进行评估(实际上今天是关于按位运算符和逻辑运算符之间区别的课程)。
但对我来说更奇怪的是,我可以做到这一点,如果非常缓慢并且没有得到我想要的结果:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0 XOR 1:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : 15; //angle from goal
break;
case 2:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
case 3:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
}
}
但我不能这样做:
for ($i=0; $i<count($this->header); $i++) {
switch($i) {
case 0 XOR 1:
$this->header[ $i ] = $this->header[ $i ] ? $this->header[ $i ] : 15; //angle from goal
break;
case 2 XOR 3:
$this->header[$i] = $this->header[$i] ? $this->header[$i] : -5; //miss penalty
break;
}
}
这是 PHP 甚至不会评估的这些可怕的、可怕的想法中唯一的一个。
我的问题是:为什么评估这些语句需要这么长时间,为什么最后一个示例没有运行?我认为 PHP 正在解释 0 XOR 1 并比较true
and false
,但我无法替换那些并让它仍然评估。有人知道这里发生了什么吗?谢谢!
更新:
评论要求一个var_dump($this->header)
(如果不是很明显,我将我最初的 switch 语句从 7 个案例截断为 4 个,只是为了避免发送相同代码的垃圾邮件行,但是,鉴于var_dump()
被要求,我选择发布整个事情以防万一揭示了我无法预见的事情!)。另外,是的,事实证明我一直在使用关联数组,因为array_values()
在设置之前忘记调用$this->header
,在下面的第二个答案中,出现此错误是为了解释switch
语句的持续时间,而第一个答案和第二个一起回答是很好的逻辑演练。
array(12) {
["theZone"]=>
NULL
["leftMiss"]=>
NULL
["rightMiss"]=>
NULL
["leftError"]=>
NULL
["rightError"]=>
NULL
["leftHit"]=>
NULL
["rightHit"]=>
NULL
["accuracy"]=>
string(5) "false"
["rt"]=>
string(4) "true"
["disease"]=>
string(3) "yes"
["bars"]=>
string(3) "yes"
["endMessage"]=>
NULL
}