tags:

views:

37

answers:

4

In PHP I'd like to do this:

switch (function_foo($bar,$bar2)) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}

Is this a terrible idea? Will it work?

+1  A: 

Never tried a function as parameter to the switch, not sure (You should give it a try), however you can first store function return value in some variable and use that in switch eg:

$return_value = function_foo($bar, $bar2);

switch ($return_value) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}
Sarfraz
+1  A: 

According to the manual, a PHP switch statement is exactly like a series of if/else if statements (if every case ends with break). That means your technique should work. As long as the function names and variable names are readable, I can't think of any problems with it.

In some other languages, the switch statement is actually a performance improvement over if/else if statements, so you need to know the case values at compile time. It doesn't look like PHP does that kind of thing.

Don Kirkby
+4  A: 

Using a function in the switch is OK : the function will be called, and will return a value -- which is the one that will be used for the case.

It's exactly the same as writing :

$my_var = function_foo($bar,$bar2);
switch ($my_var) {
    // ...
}

Even if I prefer using a variable, so the code is easier to read.


And using variables in the case is something you don't see often ; but it works fine too ;-)

Quoting the manual page of switch :

The case expression may be any expression that evaluates to a simple type, that is, integer or floating-point numbers and strings.

So, your code will work, as long as $fu and $fubar contain simple-type values.


Using a variable as a case value not often done (as far as I can tell from the code I read), probably because some other languages don't allow that (for instance, C doesn't allow that ; and the switch/case structure is borrowed from C) ; but it works :

$a = 1;
$b = 2;
switch (1) {
    case $a: echo 'a'; break;
    case $b: echo 'b'; break;
}

Will output :

a
Pascal MARTIN
A: 

Its posibble yes and its called lambda, which are hidden functions

$lambda = function($a, $b) {
    return $a * $b;
};


$return_value = function foo($bar, $bar2){ return $logic }

switch ($lambda(2,4)) {
case $fu:
    *Do Stuff*
    break;
case $fubar:
    *Do Other Stuff*
    break;
}
streetparade