Вы намекнули PHP на ожидание экземпляра FetchMode
(как сказано в сообщении об ошибке), но FetchMode::FETCH*
передает константу значение . Вам нужно будет использовать какой-то экземпляр Enum (которого у нас нет в PHP. (Ну, ладно, есть SplEnum
, но кто его использует?)) Или изменить сигнатуру метода, чтобы исключить подсказку.
Однако вместо Switch / Case вы могли бы решить эту проблему проще с помощью полиморфизма и паттерна стратегии , например. вместо того, чтобы делать что-то вроде
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:
}
}
, который увеличит Сложность Cylcomatic вашего класса и вынудит к этому классу изменения и FetchMode
всякий раз, когда вам потребуется добавить дополнительные FetchModes, вы можете сделать:
public function getRecordSet(FetchMode $fetchModeStrategy)
{
return $fetchModeStrategy->fetch();
}
и затем интерфейс до для защиты варианта
interface FetchMode
{
public function fetch();
}
и добавьте конкретные FetchMode
классы для каждого поддерживаемого FetchMode
class FetchOne implements FetchMode
{
public function fetch()
{
// code to fetchOne
}
}
class FetchAll …
class FetchRow …
Таким образом, вам никогда не придется снова прикасаться к классу с помощью этого метода getRecordSet
, потому что он будет работать для любого класса, реализующего этот FetchMode
интерфейс. Таким образом, всякий раз, когда у вас появляются новые FetchModes, вы просто добавляете новый класс, который в долгосрочной перспективе гораздо удобнее обслуживать.