switch (true) {} without a break statement
switch (true) {} without a break statement
am 28.12.2007 17:34:54 von Marijn
Hello everybody,
The switch statement is not my favorite control structure but I
figured it would fit this situation best given fall through behavior.
So I read the documentation, checked my code a thousand times but it
just _seems_ to work incorrect. The code is as follows.
public function addTimeMarker(){
$_timeparts = explode(' ', microtime());
$_markersCount = count($this->_timeMarkers);
switch (true) {
case ($_markersCount >= 0) :
//always add a new marker
$this->_timeMarkers[] = $_timeparts[1] .
substr($_timeparts[0],1);
case ($_markersCount >= 1) :
//if one or more markers already existed add time elapsed
since first marker to the log
$_durationSinceStart = bcsub($this-
>_timeMarkers[$_markersCount - 1], $this->_timeMarkers[0], 6);
ErrorLog::addMessage('Request took ' .
$_durationSinceStart . 'seconds until now', 75);
case ($_markersCount >= 2) :
//if two or more markers already existed add time elapsed
since last marker to the log
$_durationSincePreviousMarker = bcsub($this-
>_timeMarkers[$_markersCount - 1], $this->_timeMarkers[$_markersCount
- 2], 6);
ErrorLog::addMessage('Request took ' .
$_durationSincePreviousMarker . 'seconds since previous marker', 75);
break;
}
}
For some reason it will execute them all on the very first run while
$_markersCount is zero... What am I doing wrong here or why is it
doing things like this?
Thanks in advance,
Marijn
Re: switch (true) {} without a break statement
am 28.12.2007 17:39:12 von My Pet Programmer
Marijn said:
> Hello everybody,
>
> The switch statement is not my favorite control structure but I
> figured it would fit this situation best given fall through behavior.
> So I read the documentation, checked my code a thousand times but it
> just _seems_ to work incorrect. The code is as follows.
>
> public function addTimeMarker(){
> $_timeparts = explode(' ', microtime());
> $_markersCount = count($this->_timeMarkers);
> switch (true) {
> case ($_markersCount >= 0) :
> //always add a new marker
> $this->_timeMarkers[] = $_timeparts[1] .
> substr($_timeparts[0],1);
> case ($_markersCount >= 1) :
> //if one or more markers already existed add time elapsed
> since first marker to the log
> $_durationSinceStart = bcsub($this-
>> _timeMarkers[$_markersCount - 1], $this->_timeMarkers[0], 6);
> ErrorLog::addMessage('Request took ' .
> $_durationSinceStart . 'seconds until now', 75);
> case ($_markersCount >= 2) :
> //if two or more markers already existed add time elapsed
> since last marker to the log
> $_durationSincePreviousMarker = bcsub($this-
>> _timeMarkers[$_markersCount - 1], $this->_timeMarkers[$_markersCount
> - 2], 6);
> ErrorLog::addMessage('Request took ' .
> $_durationSincePreviousMarker . 'seconds since previous marker', 75);
> break;
> }
> }
>
> For some reason it will execute them all on the very first run while
> $_markersCount is zero... What am I doing wrong here or why is it
> doing things like this?
>
> Thanks in advance,
>
> Marijn
>
>
>
>
>
You're switching true. ALL of the cases are always true.
Switch the value you want to test.
Tested on:
$age = 20;
switch(true) {
case "10":
print "Yup!";
break;
}
~A!
--
Anthony Levensalor
anthony@mypetprogrammer.com
Only two things are infinite, the universe and human stupidity,
and I'm not sure about the former. - Albert Einstein
Re: switch (true) {} without a break statement
am 28.12.2007 19:02:59 von Michael Fesser
..oO(Marijn)
>The switch statement is not my favorite control structure but I
>figured it would fit this situation best given fall through behavior.
>So I read the documentation, checked my code a thousand times but it
>just _seems_ to work incorrect. The code is as follows.
>
>public function addTimeMarker(){
> $_timeparts = explode(' ', microtime());
> $_markersCount = count($this->_timeMarkers);
> switch (true) {
> case ($_markersCount >= 0) :
> //always add a new marker
> $this->_timeMarkers[] = $_timeparts[1] .
>substr($_timeparts[0],1);
> case ($_markersCount >= 1) :
> //if one or more markers already existed add time elapsed
>since first marker to the log
> $_durationSinceStart = bcsub($this-
>>_timeMarkers[$_markersCount - 1], $this->_timeMarkers[0], 6);
> ErrorLog::addMessage('Request took ' .
>$_durationSinceStart . 'seconds until now', 75);
> case ($_markersCount >= 2) :
> //if two or more markers already existed add time elapsed
>since last marker to the log
> $_durationSincePreviousMarker = bcsub($this-
>>_timeMarkers[$_markersCount - 1], $this->_timeMarkers[$_markersCount
>- 2], 6);
> ErrorLog::addMessage('Request took ' .
>$_durationSincePreviousMarker . 'seconds since previous marker', 75);
> break;
> }
>}
Every 'case' block should be terminated with a break. Have a look at the
manual on how to properly use a 'switch'. An example like above is given
there.
And if you find yourself using a switch(TRUE), you might want to
consider using 'if-else' statements instead for better code style.
switch(TRUE) is a bit abusive and only possible because PHP allows
complex expressions in the case statements. In other languages this
would not work.
Micha