I have a class:
class FetchMode
{
const FetchAll = 0;
const FetchOne = 1;
const FetchRow = 2;}
and a function:
function getRecordSet(FetchMode $FetchMode){ some switch cases }
I would like to use $FetchMode as switch case criteria but receiving an error: Catchable fatal error: Argument passed to getRecordSet() must be an instance of FetchMode, integer given
this is how I call a function:
getRecordSet(FetchMode::FetchOne);
I would like to offer a list of possible choices in calling a function. Is it possible in php?
You've hinted PHP to expect an instance of FetchMode
(just like it says in the error message), but FetchMode::FETCH*
passes the constant value. You'd have to use some sort of Enum instance (which we dont have natively in PHP. (Oh well, there is SplEnum
but who uses that?)) or change the method signature to exclude the typehint.
However, instead of a Switch/Case you could solve this more easily via Polymorphism and a Strategy pattern, e.g. instead of doing something like
public function getRecordSet($mode)
{
switch ($mode) {
case FetchMode::ALL:
// code to do a fetchAll
break;
case FetchMode::ONE:
// code to do a fetchOne
break;
default:
}
}
which will increase the Cylcomatic Complexity of your class and forces changes to that class and FetchMode
whenever you need to add additional FetchModes, you can do:
public function getRecordSet(FetchMode $fetchModeStrategy)
{
return $fetchModeStrategy->fetch();
}
and then have an interface to protect the variation
interface FetchMode
{
public function fetch();
}
and add concrete FetchMode
classes for each supported FetchMode
class FetchOne implements FetchMode
{
public function fetch()
{
// code to fetchOne
}
}
class FetchAll …
class FetchRow …
This way, you'll never have to touch the class with that getRecordSet
method again because it will work for any class implementing that FetchMode
inteface. So whenever you have new FetchModes, you simply add a new class, which is much more maintainable in the long run.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With