Tienes hinted PHP esperar una instancia de FetchMode
(como se dice en el mensaje de error), pero FetchMode::FETCH*
pasa la constante valor. Tendría que usar algún tipo de instancia de Enum (que no tenemos de forma nativa en PHP. (Bueno, hay SplEnum
, pero ¿quién usa eso?)) O cambie la firma del método para excluir el typehint.
Sin embargo, en lugar de un Switch/Case puede solve this more easily via Polymorphism y Strategy pattern, p. Ej. en vez de hacer algo así como
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:
}
}
lo que aumentará la Cylcomatic Complexity de sus clases y fuerzas de cambio en esa clase y FetchMode
cada vez que es necesario agregar FetchModes adicionales, puede hacerlo:
public function getRecordSet(FetchMode $fetchModeStrategy)
{
return $fetchModeStrategy->fetch();
}
y después de haber una clase concreta interface a protect the variation
interface FetchMode
{
public function fetch();
}
y añadir FetchMode
es para cada apoyaron fetchMode
class FetchOne implements FetchMode
{
public function fetch()
{
// code to fetchOne
}
}
class FetchAll …
class FetchRow …
De esta manera, usted nunca tiene que tocar la clase con que getRecordSet
método de nuevo, ya que funcionará para cualquier clase de implementación que FetchMode
inteface.Por lo tanto, cada vez que tenga nuevos FetchModes, simplemente agregue una nueva clase, que es mucho más fácil de mantener en el largo plazo.
FetchMode :: FetchOne resuelve en 1, por lo que realmente pasa 1 a la función, no un objeto del tipo FetchMode. No sé lo que quiere lograr, pero tenga en cuenta que debe pasar un objeto de tipo FetchMode a su función, por lo que necesita algún tipo de '' $ fm = new FetchMode(); '' – Sgoettschkes